Escribir un archivo de texto en Java cabe hoy en una línea. Las tres páginas de FileWriter, BufferedWriter y bloques try/catch que se escribían antes siguen funcionando, pero ya no hacen falta.
También te puede interesar
Una línea
import java.nio.file.*;
void main() throws Exception {
Path ruta = Path.of("salida", "notas.txt");
Files.createDirectories(ruta.getParent());
Files.writeString(ruta, "Primera línea\nSegunda línea\n");
IO.println("escrito: " + Files.size(ruta) + " bytes");
}salidaescrito: 30 bytes
Treinta bytes para veintiocho caracteres: las dos íes acentuadas ocupan dos bytes cada una en UTF-8. Desde Java 18, UTF-8 es la codificación por omisión en todas las plataformas, así que ya no hace falta pasarla en cada llamada como antes.
writeString crea el archivo si no existe y lo vacía si existe. No hace falta comprobar antes con exists() ni llamar a createNewFile(): esos dos pasos del ejemplo clásico sobran.
java.io.File, de 1996, y java.nio.file —Path y Files—, que llegó en Java 7 y es la que se usa hoy. La vieja no ha desaparecido y la verás en código antiguo, pero informa mal de los errores: file.delete() devuelve false sin decirte por qué, mientras que Files.delete() lanza una excepción que explica qué pasó. Todos los ejemplos de esta página usan la nueva.Añadir al final en vez de sobrescribir
Files.writeString(ruta, "Tercera línea\n", StandardOpenOption.APPEND);
IO.println("tras añadir: " + Files.size(ruta) + " bytes");salidatras añadir: 45 bytes
Sin APPEND, lo que había se pierde. Es el error más caro de esta página, porque no avisa de nada.
Una lista de líneas
Files.write(ruta, List.of("a", "b", "c"));
IO.println(Files.readAllLines(ruta));salida[a, b, c]
Files.write con una colección escribe cada elemento en su línea y pone el salto de línea por ti.
Cuando son muchas líneas
Path otra = Path.of("salida", "grande.txt");
try (var bw = Files.newBufferedWriter(otra)) {
for (int i = 1; i <= 3; i++) {
bw.write("línea " + i + "\n");
}
}salidalínea 1 | línea 2 | línea 3
Si el contenido no cabe cómodamente en memoria, o lo vas generando en un bucle, se abre un escritor con búfer y se va escribiendo. Lo importante es el try (…):
close(). Lo que se declara entre los paréntesis se cierra solo al salir del bloque, también si salta una excepción. En el ejemplo antiguo, el bw.close() estaba dentro del try: si write fallaba, el archivo se quedaba abierto y, peor, lo que hubiera en el búfer no llegaba al disco.Y el try/catch que no está
Todos los métodos de Files lanzan IOException, que hay que declarar o capturar. En los ejemplos de arriba está declarada con throws y el programa termina si algo falla, que para un ejemplo es lo correcto. Lo que conviene no hacer es esto:
try {
// ...
} catch (Exception e) {
e.printStackTrace(); // y el programa sigue como si nada
}Capturar Exception entero se traga también los fallos de programación, y printStackTrace escribe en la consola y continúa, de modo que el error se pierde y el programa sigue con datos a medias. O lo tratas de verdad, o lo dejas subir.
| Para… | Usa |
|---|---|
| Escribir un texto entero | Files.writeString(ruta, texto) |
| Añadir al final | el mismo, con StandardOpenOption.APPEND |
| Escribir una lista de líneas | Files.write(ruta, lista) |
| Ir escribiendo en un bucle | Files.newBufferedWriter dentro de un try-with-resources |
| Escribir bytes | Files.write(ruta, arregloDeBytes) |
| Crear la carpeta antes | Files.createDirectories(ruta.getParent()) |
Más información en inglés: Create text files in Java.
Todo el código se compiló y se ejecutó con Java 25 LTS en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.
Información que cura…
Me fue de mucha ayuda gracias!
I’m learning Java and yours examples are useful for me, Thank you
Thanks
Gracias por la colaboración me sirvio mucho
Hi! I have a problen when I ran that…
Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.0.0:exec (default-cli) on project CREADOR_TXT: Command execution failed.: Process exited with an error: 1 (Exit value: 1) -> [Help 1]
To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.