文章目录
File类简介
File类在Java中用来表示一个文件或目录
- 可以获取
文件
和目录
属性(创建时间,上一次修改时间,是否是文件,是否是目录)
- 可以对文件和目录进行创建、删除
- File不能获取文件的内容
File类常用属性
File类有几个类似separator的静态字段,都是与系统相关的,在编程时应尽量使用。
File.separator
-
在Windows与Linux下的路径分隔符是不一样的,Java代码直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常, 因为
绝对路径是以盘符开头
,Windows系统的盘符为“”D: E:”, Linux系统的盘符都是以 "/"开头
-
File.separator
表示系统目录中的间隔符,就是斜线“/”, -
在 UNIX 系统上,此字段的值为
'/'
;在 Windows 系统上,它为'\'
(由于在Java中反斜杠表示转义符号
, 所以需要将\
转义\\
)
如: 在temp目录下创建test.txt文件,
//在Windows写法:以 “C:/D:”盘开头
File file1 = new File ("D:\\tmp\\test.txt");
//在Linux写法::以 "/”开头
File file2 = new File ("/tmp/test.txt");
如果要考虑跨平台,则最好是这么写:
File file= new File("D:" + File.separator + "tmp" + File.separator, "test.txt");
File.pathSeparator
- 与系统有关的路径分隔符。此字符用于分隔以路径列表 形式给定的文件序列中的文件名。在 UNIX 系统上此字段为
':'
;在 Microsoft Windows 系统上,它为';'
。
如果创建File对象
- 可以通过
相对路径
与绝对路径
构造 File对象
- 相对路径
File(String parent, String child) ==> File("E:/xp/test","2.jpg")
File(File parent, String child) ==> File(new File("E:/xp/test"),"2.jpg")
- 绝对路径
File(String name); ==> File("E:/xp/test/2.jpg")
//没有盘符: 以 user.dir (System.getProperty("user.dir"))构建,也就是当前目前项目的路径:E:\resource\java-base-demo\
File file =new File("test.txt") //即:System.getProperty("user.dir")/test.txt
File类的常用方法
获取
方法 | 说明 |
---|---|
getName() | 获取文件或目录名 |
getPath() | 获取相对路径 |
getAbsoluteFile() | 获取绝对路径所对应的File对象 |
getAbsolutePath() | 获取绝对路径 |
getParent() | 获取父目录 (相对路径的父目录,可能为null 如. 删除本身后的结果) |
LastModified() | 获取文件的最后修改时间 |
Length() | 获取文件长度 ,为字节数 不能读取文件夹的长度 |
ToString() | 获取文件状态的字符串 |
高级获取
方法 | 说明 |
---|---|
String[] list() | 获取路径表示目录下的所有文件和目录名称 |
String[] list(FilenameFilter filter) | 获取满足过滤器FilenameFilter 条件的所有目录或文件名称 |
File[] listFiles() | 获取路径表示目录下的所有文件和目录对象 |
File[] listFiles(FilenameFilter filter) | 获取满足过滤器FilenameFilter 条件的所有目录或文件对象 |
File[] listRoots() | 获取系统的根目录, windows为“D/C/F”盘 ,Linxu为 “/”目录 |
使用文件过滤器FilenameFilter获取目录下指定文件
//如果是文件,且是.jpg结尾的图片,则返回到 subFiles
File [] subFiles =src.listFiles(new FilenameFilter(){
@Override
/**
* dir 代表src
* name 代表文件名
*/
public boolean accept(File dir, String name) {
System.out.println(dir.getAbsolutePath());
return new File(dir,name).isFile()&&name.endsWith(".jpg");
}
});
判断
方法 | 说明 |
---|---|
CanWrite() | 判断文件是否可写 |
CanRead() | 判断文件是否可读 |
Exists() | 判断文件或者目录是否存在 |
IsFile() | 判断该路径指示的是否是文件 |
IsDirectory() | 判断该路径指示的是否是目录 |
isHidden() () | 判断文件是否隐藏 |
创建和删除
方法 | 说明 |
---|---|
mkdir | 创建目录(必须确保 父目录存在,如果不存在,创建失败) |
mkdirs() | 创建目录,如果父目录不存在则一同创建 |
createNewFile() | 创建新文件,不存在才创建,存在返回true |
static createTempFile(前缀3个字节长,后缀默认.temp) | 创建临时文件到默认临时目录,临时文件的默认目录位于System.getProperty("java.io.tmpdir") |
static createTempFile(前缀3个字节长,后缀默认.temp,目录) | 创建临时文件到指定目录(下面举例) |
delete() | 删除文件 |
deleteOnExit() | 虚拟机退出后删除,常用于删除临时文件, |
renameTo() | 重命名文件 |
临时文件创建
//static createTempFile(前缀3个字节长,后缀默认.temp) 默认临时空间(临时文件的默认目录位于`System.getProperty("java.io.tmpdir")`)
//static createTempFile(前缀3个字节长,后缀默认.temp,目录)
File temp= File.createTempFile("tes", ".temp",new File("E:/data/test"));
//会在E:/data/test创建临时文件 tes8926064512956475651.temp, "8926064512956475651"这串数字是随机生成的
递归输出子孙级目录|文件的名称(绝对路径)
/**
*
* @param src 输出路径
*/
public static void printName(File src){
if(null==src || !src.exists()){
return ;
}
System.out.println(src.getAbsolutePath());
if(src.isDirectory()){ //文件夹
for(File sub:src.listFiles()){
printName(sub);
}
}
}
面向对象方式递归输出子孙级目录|文件的大小/文件总数/目录总数
import java.io.File;
/**
* 使用面向对象: 统计文件夹的大小
*/
public class DirCount {
//大小
private long len;
//文件夹路径
private String path;
//文件的个数
private int fileSize;
//文件夹的个数
private int dirSize;
//源
private File src;
public DirCount(String path) {
this.path = path;
this.src = new File(path);
count(this.src);
}
//统计大小
private void count(File src) {
//获取大小
if(null!=src && src.exists()) {
if(src.isFile()) { //大小
len+=src.length();
this.fileSize++;
}else { //子孙级
this.dirSize++;
for(File s:src.listFiles()) {
count(s);
}
}
}
}
public long getLen() {
return len;
}
public int getFileSize() {
return fileSize;
}
public int getDirSize() {
return dirSize;
}
public static void main(String[] args) {
DirCount dir = new DirCount("D:\\data\\test");
System.out.println(dir.getLen()+"-->"+dir.getFileSize()+"-->"+dir.getDirSize());
}
}
Path类
Java标准类库还提供了一个Path
对象,它位于·java.nio.file·包。Path对象和File对象类似,但操作更加简单:
public static void main(String[] args) throws IOException {
Path pathObj = Paths.get(".", "project", "study"); // 构造一个Path对象
System.out.println("pathObj=>"+pathObj);
Path absolutePath = pathObj.toAbsolutePath(); // 转换为绝对路径
System.out.println("absolutePath=>"+absolutePath);
Path normalizePath = absolutePath.normalize(); // 转换为规范路径
System.out.println("normalizePath=>"+normalizePath);
File file = normalizePath.toFile(); // 转换为File对象
System.out.println("file=>"+file);
for (Path path : Paths.get("..").toAbsolutePath()) { // 可以直接遍历Path
System.out.println(" " + path);
}
}
如果需要对目录进行复杂的拼接、遍历等操作,使用Path
对象更方便。