1. 使用原生 Java 实现

我们先来看最基础的 Java 原生实现方式。核心思路是:先把 Reader 中的内容读取出来,再写入到目标文件中。

@Test
public void givenUsingPlainJava_whenWritingReaderContentsToFile_thenCorrect() 
  throws IOException {
    Reader initialReader = new StringReader("Some text");

    int intValueOfChar;
    StringBuilder buffer = new StringBuilder();
    while ((intValueOfChar = initialReader.read()) != -1) {
        buffer.append((char) intValueOfChar);
    }
    initialReader.close();

    File targetFile = new File("src/test/resources/targetFile.txt");
    targetFile.createNewFile();

    Writer targetFileWriter = new FileWriter(targetFile);
    targetFileWriter.write(buffer.toString());
    targetFileWriter.close();
}

✅ 这种方式虽然代码量稍多,但逻辑清晰,适合对 IO 流操作有控制需求的场景。

⚠️ 注意手动关闭流,避免资源泄露。


2. 使用 Google Guava 实现

Guava 提供了更高层的抽象,使得代码更加简洁。我们可以直接将 Reader 的内容通过 CharSink 写入文件。

@Test
public void givenUsingGuava_whenWritingReaderContentsToFile_thenCorrect() 
  throws IOException {
    Reader initialReader = new StringReader("Some text");

    File targetFile = new File("src/test/resources/targetFile.txt");
    com.google.common.io.Files.touch(targetFile);
    CharSink charSink = com.google.common.io.Files.
      asCharSink(targetFile, Charset.defaultCharset(), FileWriteMode.APPEND);
    charSink.writeFrom(initialReader);

    initialReader.close();
}

✅ Guava 的优势在于封装良好,语义明确,减少样板代码。

⚠️ 需要注意 Guava 的 Files 类已被标记为 @Beta,在生产环境使用时要评估稳定性风险。


3. 使用 Apache Commons IO 实现

Apache Commons IO 同样提供了便捷的方法来处理 IO 操作。这里我们先把 Reader 转为字节数组,再写入文件。

@Test
public void givenUsingCommonsIO_whenWritingReaderContentsToFile_thenCorrect() 
  throws IOException {
    Reader initialReader = new CharSequenceReader("CharSequenceReader extends Reader");

    File targetFile = new File("src/test/resources/targetFile.txt");
    FileUtils.touch(targetFile);
    byte[] buffer = IOUtils.toByteArray(initialReader);
    FileUtils.writeByteArrayToFile(targetFile, buffer);

    initialReader.close();
}

✅ Commons IO 是 Java 生态中非常成熟稳定的工具库,适合在项目中广泛使用。

⚠️ 注意依赖版本兼容性问题,尤其是与 Spring 等框架集成时。


以上就是三种将 Reader 内容写入文件的方式,分别适用于不同场景:

方式 优点 缺点
原生 Java 无依赖、控制力强 代码冗长、易出错
Guava 代码简洁、API 友好 部分 API 不稳定
Commons IO 成熟稳定、社区支持好 需引入额外依赖

根据实际项目需求选择合适的方案即可,简单粗暴又高效。


原始标题:Java - Write a Reader to File | Baeldung

« 上一篇: Baeldung周报第30期
» 下一篇: Baeldung周报31