JAVA中的文件操作2-如何读写文件

前面的JAVA中的文件操作1-如何获取文件信息,创建文件介绍了如何获取文件的信息,我们对文件大部分时候是读写操作,下面介绍一下。

文件读取

小文件读取

当我们要读取的文件较小,可以一次性处理时,有两种读取方式:

  1. 使用Files.readString直接将整个文件的内容读取成一个字符串
  2. 使用Files.readAllLines将文件内容读取成一个列表,按行分割。

注意:默认读取的字符集都是UTF-8,如果文件的字符集不是这个,这两个方法都提供了重载。这两个方法都是一次性把所有文件内容读入内存,如果文件较大,请不要使用这两个方法读取。

下面是代码示例:

Path path = Path.of("examlpe.txt");

// 使用`Files.readString`直接将整个文件的内容读取成一个字符串
String content = Files.readString(path);
System.out.println(content);

// 使用`Files.readAllLines`将文件内容读取成一个列表,按行分割
List<String> contentLines = Files.readAllLines(path);
System.out.println(contentLines);

大文件读取

大文件读取可以使用Files.lines方法,将文件读取成一个Stream<String>,每项内容是文件的一行,如下所示:

Path path = Path.of("examlpe.txt");
Files.lines(path).forEach(System.out::println);

注意:默认读取的字符集都是UTF-8,如果文件的字符集不是这个,这个方法都提供了重载Files.lines(Path path, Charset cs)

文件写入

我们可以通过Files.writeString来写入单个字符串,也可以通过Files.write来写入多行字符串,或者是二进制数据。
写入时必须指定字符集。

下面是一个简单示例:

Path path = Path.of("examlpe_write_1.txt");

// 写入单个字符串
Files.writeString(path, "hello", StandardCharsets.UTF_8);

// 写入多行
List<String> lines = List.of("hello", "world"); // 1.9新增的便捷方法
Files.write(path, lines, StandardCharsets.UTF_8);

这里面的writewriteString方法,默认情况下,文件不存在会新建文件,文件存在的话会清空原内容后再写入。如果不希望这样,这两个方法都提供了一个重载参数OpenOption... options,可以用于指定打开文件的方式,这些方式都在java.nio.file.StandardOpenOption中有定义,下面是常用的几个:

  1. StandardOpenOption.READ 以读方式打开文件
  2. StandardOpenOption.WRITE 以写方式打开文件
  3. StandardOpenOption.CREATE 文件不存在会新建文件,文件存在则无影响
  4. StandardOpenOption.CREATE_NEW 文件不存在会新建文件,文件存在则报错
  5. StandardOpenOption.TRUNCATE_EXISTING 以写方式打开文件时清空文件内容
  6. StandardOpenOption.APPEND 以写方式打开文件时,新写入内容会被追加到文件尾

比如,前面的示例,我们希望改成追加写入。则可以这样写:

Path path = Path.of("examlpe_write_2.txt");
Files.writeString(path, "hello", StandardCharsets.UTF_8, StandardOpenOption.APPEND);

List<String> lines = List.of("hello", "world");
Files.write(path, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);