0%

Java 文件基本技术(四):文件和目录操作

1. Java 中 File 类的理解

  • File 既可以表示文件,也可以表示目录
  • File 构造方法中的路径参数可以是已经存在的,也可以是不存在的。可以是相对路径,也可以是绝对路径
  • 通过 new 新建一个 File 对象,不会实际创建一个文件,只是创建一个表示文件或目录的对象。new 之后,File 对象中的路径是不可变的

2. 文件元数据原理

  • 文件元数据主要包括文件名和路径、文件基本信息以及一些安全和权限相关的信息
  • separatorseparatorChar 表示文件路径分隔符。在 Windows 系统中,一般为 '\',Linux 系统中一般为 '/'
  • pathSeparatorpathSeparatorChar 表示多个文件路径中的分隔符。在 Windows 系统中,一般为 ;,在 Linux 系统中,一般为 :
  • File 对象没有返回创建时间的方法,因为创建时间不是一个公共概念,Linux/Unix 就没有创建时间的概念

3. 文件操作理解

  • 文件操作主要有创建、删除、重命名
  • 新建一个 File 对象不会实际创建文件,但方法 public boolean createNewFile() throws IOException 可以,创建成功返回 true,否则返回 false,新创建的文件内容为空。如果文件已存在,不会创建
  • public boolean delete() 方法是删除文件或目录。要删除目录,先要删除目录下的所有子目录和文件,否则不能删除。删除成功返回 true,否则返回 false
  • public void deleteOnExit() 方法File 对象加入到待删列表,在 Java 虚拟机正常退出的时候进行实际删除。
  • 重命名方法 public boolean renameTo(File dest),参数 dest 代表重命名后的文件,重命名能否成功与系统有关,返回值代表是否成功

4. 方法 public boolean mkdir() 和 方法 public boolean mkdirs() 的异同

  • File 对象代表目录时,可以执行目录相关的操作,如创建、遍历
  • 相同:它们都是创建目录,创建成功返回 true,失败返回 false。如果目录已存在,返回值是 false
  • 不同:如果某一个中间父目录不存在,则 mkdir()失败,返回 false,而 mkdirs() 则会创建必需的中间父目录

5. 列出当前目录下的所有扩展名为 .txt 的文件

1
2
3
4
5
6
7
8
9
10
File f = new File(".");
File[] files = f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(name.endWith(".txt")) {
return true;
}
return false;
}
});

6. 计算一个目录下的所有文件的大小(包括子目录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static long sizeOfDirectory(final File directory) {
long size = 0;
if(directory.isFile()) {
return directory.length();
} else {
for(File file : directory.listFiles()) {
if(file.isFile()) {
size += file.length();
} else {
size += sizeOfDirectory(file);
}
}
return size;
}
}

7. 在一个目录下,查找所有给定文件名的文件

1
2
3
4
5
6
7
8
9
10
11
public static Collection<File> findFile(final File directory, final String fileName) {
List<File> files = new ArrayList<> ();
for(File f : directry.listFiles()) {
if(f.isFile() && f.getName().equals(fileName)) {
files.add(f);
} else if(f.isDirectory()) {
files.addAll(findFile(f, fileName));
}
}
return files;
}

8. 写一个删除一个非空目录的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void deleteRecursively(final File file) throws IOException {
if(file.isFile()) {
if(!file.delete()) {
throw new IOException("Failed to delete " + file.getCanonicalPath());
}
} else if(file.isDirectory()) {
for(File chile : file.listFiles()) {
deleteRecursively(child);
}
if(!file.delete()) {
throw new IOException("Failed to delete " + file.getCanonicalPath());
}
}
}
-------------------- 本文结束感谢您的阅读 --------------------