将 Java StringBuilder 转储到文件

2022-09-01 01:16:05

将StringBuilder转储到文本文件的最有效/最优雅的方法是什么?

您可以执行以下操作:

outputStream.write(stringBuilder.toString().getBytes());

但是,对于很长的文件,这是否有效?

有没有更好的方法?


答案 1

正如其他人所指出的,使用Writer,并使用BufferedWriter,但不要只调用。writer.write(stringBuilder.toString());writer.append(stringBuilder);

编辑:但是,我看到你接受了一个不同的答案,因为它是一句话。但该解决方案存在两个问题:

  1. 它不接受 .坏。应始终显式指定字符集。java.nio.Charset

  2. 它仍然让你遭受.如果简单性真的是你所追求的,请尝试Guava项目中的以下内容:stringBuilder.toString()

Files.write(stringBuilder, file, Charsets.UTF_8)


答案 2

应使用 BufferedWriter 来优化写入操作(始终使用编写器而不是 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 带宽,除非另一个线程在写入的同时尝试从磁盘读取大量数据。