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 | 成熟稳定、社区支持好 | 需引入额外依赖 |
根据实际项目需求选择合适的方案即可,简单粗暴又高效。