将 StringBuilder 转储到文本文件的最有效/优雅的方法是什么?
你可以做:
outputStream.write(stringBuilder.toString().getBytes());
但这对于一个很长的文件有效吗?
有没有更好的办法?
原文由 Patrick 发布,翻译遵循 CC BY-SA 4.0 许可协议
将 StringBuilder 转储到文本文件的最有效/优雅的方法是什么?
你可以做:
outputStream.write(stringBuilder.toString().getBytes());
但这对于一个很长的文件有效吗?
有没有更好的办法?
原文由 Patrick 发布,翻译遵循 CC BY-SA 4.0 许可协议
您应该使用 BufferedWriter 来优化写入(始终使用 Writer 而不是 OutputStream 写入字符数据)。如果您不写入字符数据,则可以使用 BufferedOutputStream。
File file = new File("path/to/file.txt");
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(file));
writer.append(stringBuilder);
} finally {
if (writer != null) writer.close();
}
或者,使用 try-with-resources(Java 7 及更高版本)
File file = new File("path/to/file.txt");
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.append(stringBuilder);
}
由于您最终要写入文件,因此更好的方法是更频繁地写入 BufferedWriter 而不是在内存中创建一个巨大的 StringBuilder 并在最后写入所有内容(取决于您的用例,您甚至可以完全消除 StringBuilder)。在处理过程中增量写入将节省内存并更好地利用您有限的 I/O 带宽,除非另一个线程试图在您写入的同时从磁盘读取大量数据。
原文由 rob 发布,翻译遵循 CC BY-SA 4.0 许可协议
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
正如其他人所指出的,使用 Writer,并使用 BufferedWriter,但不要调用
writer.write(stringBuilder.toString());
而只是writer.append(stringBuilder);
。编辑:但是,我看到您接受了一个不同的答案,因为它是单行的。但该解决方案有两个问题:
它不接受
java.nio.Charset
。坏的。您应该始终明确指定一个字符集。它仍然让你遭受
stringBuilder.toString()
。如果您真正追求的是简单性,请尝试使用 Guava 项目中的以下方法:Files.write(stringBuilder,文件,Charsets.UTF_8)