Solución:
Como han señalado otros, use un Writer y use un BufferedWriter, pero luego no llame writer.write(stringBuilder.toString());
en su lugar solo writer.append(stringBuilder);
.
EDITAR: Pero, veo que aceptó una respuesta diferente porque era de una sola línea. Pero esa solución tiene dos problemas:
-
no acepta un
java.nio.Charset
. MALO. Siempre debe especificar un juego de caracteres explícitamente. -
todavía te hace sufrir un
stringBuilder.toString()
. Si la simplicidad es realmente lo que busca, pruebe lo siguiente del proyecto Guava:
Files.write (stringBuilder, archivo, Charsets.UTF_8)
Debe usar un BufferedWriter para optimizar las escrituras (siempre escriba datos de caracteres usando un Writer en lugar de un OutputStream). Si no estuviera escribiendo datos de caracteres, usaría un BufferedOutputStream.
File file = new File("path/to/file.txt");
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(file));
writer.write(stringBuilder.toString());
} finally {
if (writer != null) writer.close();
}
o, usando try-with-resources (Java 7 y superior)
File file = new File("path/to/file.txt");
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write(stringBuilder.toString());
}
Dado que en última instancia está escribiendo en un archivo, un mejor enfoque sería escribir en BufferedWriter con más frecuencia en lugar de crear un enorme StringBuilder en la memoria y escribir todo al final (dependiendo de su caso de uso, es posible que incluso pueda para eliminar el StringBuilder por completo). Escribir de forma incremental durante el procesamiento ahorrará memoria y hará un mejor uso de su ancho de banda de E / S limitado, a menos que otro hilo esté tratando de leer una gran cantidad de datos del disco al mismo tiempo que está escribiendo.
Puede usar la biblioteca IO de Apache Commons, que le brinda FileUtils:
FileUtils.writeStringToFile(file, stringBuilder.toString(), Charset.forName("UTF-8"))