BufferedWriter、FileWriter、Output Stream……做这些事情最现代的方法是什么?

BufferedWriter, FileWriter, Output Stream...What's the most modern way to do these things?

我正在尝试以编程方式在 java 中创建一个新文件,并将一个字符串数组写入该文件。如果该文件已经存在,我只想附加另一个字符串数组(这就像一个日志文件)。做这样的事情最 'modern' 的方法是什么? FileWriter 和 Buffered writer 仍然可行吗?我在这里找到的大部分内容都是 2010 年的……那是 5 年前的事了!

编辑:我实际上需要接受一个 ArrayList 但应该没有区别

Java IO 基本上没有变化:

  • BufferedWriter缓冲写入能力,
  • FileWriter 允许您将文本数据写入文件,
  • OutputStream 允许您写入二进制数据。

你应该使用类似的东西:

Writer writer = new BufferedWriter(new FileWriter(file, true)); // true to append data

或者使用NIO.2。

自 Java SE 7 以来,有新的 NIO.2 文件 API。特别是 Files 实用程序 class 可以帮助您创建 IO 流。

我建议阅读 tutorial 如果您有更多问题,请回来。

使用 Java NIO,您可以避免直接处理流并通过以下方式实现您的结果:

List<String> lines = //...  

Path file = Paths.get("your path...");      
Files.write(file, lines, StandardCharsets.UTF_8,
    StandardOpenOption.APPEND, StandardOpenOption.CREATE);

您可以将多个 OptionOption 值传递给该方法。这里我们传递 CREATEAPPEND 告诉 NIO 如果文件不存在就创建文件,如果文件已经存在则附加到文件。

FileReader 和 FileWriter 是旧实用程序 类,需要不太冗长的用法,但它们使用平台的默认字符编码。这使得数据不可移植。更好的方法是使用额外的 InputStreamReader 或 OutputStreamWriter。它们通过具有指定编码的构造函数从二进制流桥接到文本 Reader/Writer。

对于现代(缩短!)用法,请参阅路径、路径,尤其是 Files

Path path = Paths.get("/etc/passwd");
try (BufferedReader in = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
    ...
} // Closes.