【问题标题】:BufferedWriter, FileWriter, Output Stream...What's the most modern way to do these things?BufferedWriter、FileWriter、Output Stream...什么是最现代的方式来做这些事情?
【发布时间】:2015-05-07 03:13:47
【问题描述】:

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

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

【问题讨论】:

  • 您不需要最现代的方式。你需要最好的方法。对于一些“最佳”的价值。

标签: java file logging streamwriter bufferedwriter


【解决方案1】:

Java IO 基本上没有改变:

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

你应该使用类似的东西:

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

或者使用 NIO.2。

【讨论】:

  • 有新的 NIO.2 文件 API。 File 是一个遗留类,我也认为 FileWriter 是一个遗留类(您将使用 Files 的实用方法之一)。
【解决方案2】:

从 Java SE 7 开始,有了新的 NIO.2 文件 API。特别是 Files 实用程序类可以帮助您创建 IO 流。

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

【讨论】:

    【解决方案3】:

    使用 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如果文件不存在就创建文件,如果文件已经存在就追加到文件中。

    【讨论】:

    • 我刚刚读到 StandardOpenOption 会在文件不存在时创建文件...这正是我想要的,谢谢!
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-12
      • 2019-08-13
      • 1970-01-01
      • 2013-07-27
      • 2020-06-14
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多