1.Files

文件类

要处理文件,有一个巧妙的实用程序类 — java.nio.file.Files. 它有适合各种场合的方法。这个类的所有方法都是静态的,并且对 Path 对象进行操作。有很多方法,所以我们只考虑最重要的方法:

方法 描述
Path createFile(Path path)
创建一个新文件,其路径为path
Path createDirectory(Path path)
创建一个新目录
Path createDirectories(Path path)
创建多个目录
Path createTempFile(prefix, suffix)
创建一个临时文件
Path createTempDirectory(prefix)
创建一个临时目录
void delete(Path path)
删除一个文件或目录,如果它是空的
Path copy(Path src, Path dest)
复制文件
Path move(Path src, Path dest)
移动文件
boolean isDirectory(Path path)
检查路径是否是目录而不是文件
boolean isRegularFile(Path path)
检查路径是否是文件而不是目录
boolean exists(Path path)
检查给定路径中是​​否存在对象
long size(Path path)
返回文件大小
byte[] readAllBytes(Path path)
以字节数组的形式返回文件的全部内容
String readString(Path path)
以字符串形式返回文件的全部内容
List<String> readAllLines(Path path)
以字符串列表的形式返回文件的全部内容
Path write(Path path, byte[])
将字节数组写入文件
Path writeString(Path path, String str)
将字符串写入文件
DirectoryStream<Path> newDirectoryStream(Path dir)
从给定目录返回文件(和子目录)的集合

2.创建文件和目录

文件和目录很容易创建。让我们用一些例子说服自己:

代码 笔记
Files.createFile(Path.of("c:\\readme.txt"));
创建一个文件
Files.createDirectory(Path.of("c:\\test"));
创建一个目录
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
创建一个目录和所有必要的子目录(如果它们不存在)。

3.复制、移动、删除

复制、移动和删除文件同样简单。这也适用于目录,但它们必须是空的。

代码 笔记
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
复制文件
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
移动和重命名文件
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
删除文件

4. 检查文件的类型和存在

当你有别人提供的路径时,你想知道它是文件还是目录。一般来说,这样的文件/目录是否存在?

这也有特殊的方法。您还可以轻松找出文件的长度:

代码 笔记
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
 Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. 处理文件内容

最后,还有一系列的方法可以轻松读取或写入文件的内容。例子:

代码 描述
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

读取文件内容作为字符串列表。

显示字符串


6.获取目录内容

最有趣的方法仍然存在。它用于获取给定目录中的文件和子目录。

我们正在谈论newDirectoryStream()返回一个特殊DirectoryStream<Path>对象的方法。它有一个迭代器(!),您可以使用它来获取给定目录的所有文件和子目录。

这比听起来容易。

代码 描述
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


获取包含文件列表的对象
遍历文件列表

DirectoryStream<Path>对象有两个属性。首先,它有一个返回文件路径的迭代器,我们可以在循环中使用这个对象for-each

其次,这个对象是一个数据流,所以它必须使用close()方法显式关闭,或者在块内声明使用try-with-resources



七、Files.newInputStream方法

从 Java 5 开始,FileInputStreamFileOutputStream类已被弃用。它们的缺点之一是创建这些类的对象时,会立即在磁盘上创建文件。并且所有与文件创建相关的异常都可能被抛出。

后来这被认为不是最好的决定。因此,建议使用java.nio.Files实用程序类的方法来创建文件对象。

这是创建文件的旧方法和新方法之间的比较:

String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

并且有一个类似的替代品FileOutputStream

String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );