txt - ¿Cómo agregar una nueva línea de texto a un archivo existente en Java?
modificar archivos txt en java (7)
Esta pregunta ya tiene una respuesta aquí:
- Cómo anexar texto a un archivo existente en Java 30 respuestas
Me gustaría añadir una nueva línea a un archivo existente sin borrar la información actual de ese archivo. En resumen, aquí está la metodología que estoy usando la hora actual:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.Writer;
Writer output;
output = new BufferedWriter(new FileWriter(my_file_name)); //clears file every time
output.append("New Line!");
output.close();
El problema con las líneas anteriores es simplemente que están borrando todos los contenidos de mi archivo existente y luego agregando el nuevo texto de línea.
Quiero agregar texto al final de los contenidos de un archivo sin borrar o reemplazar nada.
A partir de Java 7 :
Defina una ruta y la cadena que contiene el separador de línea al comienzo:
Path p = Paths.get("C://Users//first.last//test.txt");
String s = System.lineSeparator() + "New Line!";
y luego puedes usar uno de los siguientes enfoques:
Usando
Files.write
(archivos pequeños):try { Files.write(p, s.getBytes(), StandardOpenOption.APPEND); } catch (IOException e) { System.err.println(e); }
Usando
Files.newBufferedWriter
(archivos de texto):try (BufferedWriter writer = Files.newBufferedWriter(p, StandardOpenOption.APPEND)) { writer.write(s); } catch (IOException ioe) { System.err.format("IOException: %s%n", ioe); }
Usando
Files.newOutputStream
(interoperable con las API dejava.io
):try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(p, StandardOpenOption.APPEND))) { out.write(s.getBytes()); } catch (IOException e) { System.err.println(e); }
Usando
Files.newByteChannel
(archivos de acceso aleatorio):try (SeekableByteChannel sbc = Files.newByteChannel(p, StandardOpenOption.APPEND)) { sbc.write(ByteBuffer.wrap(s.getBytes())); } catch (IOException e) { System.err.println(e); }
Utilizando
FileChannel.open
(archivos de acceso aleatorio):try (FileChannel sbc = FileChannel.open(p, StandardOpenOption.APPEND)) { sbc.write(ByteBuffer.wrap(s.getBytes())); } catch (IOException e) { System.err.println(e); }
Los detalles sobre estos métodos se pueden encontrar en el tutorial de Oracle .
En caso de que esté buscando un método de cortar y pegar que cree y escriba en un archivo, aquí hay uno que escribí que solo toma una entrada de Cadena. Elimine ''verdadero'' de PrintWriter si desea sobrescribir el archivo cada vez.
private static final String newLine = System.getProperty("line.separator");
private synchronized void writeToFile(String msg) {
String fileName = "c://TEMP//runOutput.txt";
PrintWriter printWriter = null;
File file = new File(fileName);
try {
if (!file.exists()) file.createNewFile();
printWriter = new PrintWriter(new FileOutputStream(fileName, true));
printWriter.write(newLine + msg);
} catch (IOException ioex) {
ioex.printStackTrace();
} finally {
if (printWriter != null) {
printWriter.flush();
printWriter.close();
}
}
}
En la línea 2, cambie el new FileWriter(my_file_name)
al new FileWriter(my_file_name, true)
modo que esté adjuntando al archivo en lugar de sobreescribirlo.
File f = new File("/path/of/the/file");
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
bw.append(line);
bw.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
La solución con FileWriter
está funcionando, sin embargo, no tiene posibilidad de especificar la codificación de salida, en cuyo caso se utilizará la codificación predeterminada para la máquina, ¡y esto generalmente no es UTF-8!
Entonces, en el mejor de los casos, use FileOutputStream
:
Writer writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file, true), "UTF-8"));
Pruebe: " / r / n "
Ejemplo de Java 7:
// append = true
try(PrintWriter output = new PrintWriter(new FileWriter("log.txt",true)))
{
output.printf("%s/r/n", "NEWLINE");
}
catch (Exception e) {}
Puede usar el FileWriter(String fileName, boolean append)
si desea adjuntar datos al archivo.
Cambia tu código a esto:
output = new BufferedWriter(new FileWriter(my_file_name, true));
Desde FileWriter javadoc:
Construye un objeto FileWriter dado un nombre de archivo. Si el segundo argumento es verdadero , los bytes se escribirán al final del archivo en lugar de al principio.
debe abrir el archivo en modo de FileWriter(String fileName, boolean append)
, lo que se puede lograr utilizando el FileWriter(String fileName, boolean append)
.
output = new BufferedWriter(new FileWriter(my_file_name, true));
debería hacer el truco