Pregunta

Quiero reescribir el contenido de un archivo.

Lo que he pensado hasta ahora es esto:

  1. Guardar el nombre del archivo
  2. Eliminar el archivo existente
  3. Crear un nuevo archivo vacío con el mismo nombre
  4. Escriba el contenido deseado en el archivo vacío

¿Es esta la mejor manera? ¿O hay una forma más directa, es decir, no tener que eliminar y crear archivos, sino simplemente cambiar el contenido?

¿Fue útil?

Solución

Para sobrescribir el archivo foo.log con FileOutputStream:

File myFoo = new File("foo.log");
FileOutputStream fooStream = new FileOutputStream(myFoo, false); // true to append
                                                                 // false to overwrite.
byte[] myBytes = "New Contents\n".getBytes(); 
fooStream.write(myBytes);
fooStream.close();

o con FileWriter:

File myFoo = new File("foo.log");
FileWriter fooWriter = new FileWriter(myFoo, false); // true to append
                                                     // false to overwrite.
fooWriter.write("New Contents\n");
fooWriter.close();

Otros consejos

Recomiendo encarecidamente utilizar FileUtil de Apache Common para esto. He encontrado este paquete invaluable. Es fácil de usar e igualmente importante, es fácil de leer / comprender cuando vuelves un poco más tarde.

//Create some files here
File sourceFile = new File("pathToYourFile");
File fileToCopy = new File("copyPath");

//Sample content
org.apache.commons.io.FileUtils.writeStringToFile(sourceFile, "Sample content");

//Now copy from source to copy, the delete source.
org.apache.commons.io.FileUtils.copyFile(sourceFile, fileToCopy);
org.apache.commons.io.FileUtils.deleteQuietly(sourceFile);

Se puede encontrar más información en: http://commons.apache.org/io /api-release/org/apache/commons/io/FileUtils.html

Ver: java.io.RandomAccessFile

Deberá abrir un archivo de lectura y escritura, así que:

RandomAccessFile raf = new RandomAccessFile("filename.txt", "rw");
String tmp;
while (tmp = raf.readLine() != null) {
    // Store String data
}
// do some string conversion
raf.seek(0);
raf.writeChars("newString");

A menos que solo esté agregando contenido al final, es razonable hacerlo de esa manera. Si está anexando, intente FileWriter con el constructor adjunto.

Un orden un poco mejor sería:

  1. Generar nuevo nombre de archivo (por ejemplo, foo.txt.new)
  2. Escribir contenido actualizado en un nuevo archivo.
  3. Cambiar el nombre atómico de foo.txt.new a foo.txt

Desafortunadamente, renameTo es no está garantizado para hacer un cambio de nombre atómico.

En el siguiente ejemplo, el "falso" hace que el archivo se sobrescriba, verdadero causaría lo contrario.

File file=new File("C:\Path\to\file.txt");
DataOutputStream outstream= new DataOutputStream(new FileOutputStream(file,false));
String body = "new content";
outstream.write(body.getBytes());
outstream.close(); 

Hay momentos en los que uno puede querer mantener un archivo vacío enorme para evitar el costo adicional del espacio de asignación del sistema operativo según sea necesario. Esto generalmente se realiza mediante bases de datos, máquinas virtuales y también en programas por lotes que procesan y escriben datos en masa. Esto mejoraría significativamente el rendimiento de la aplicación. En estos casos, escribir un nuevo archivo y renombrarlo realmente no ayudaría. En cambio, el archivo vacío tendrá que ser llenado. Es entonces cuando uno debe ir al modo de anulación.

Guava File.write " Sobrescribe un archivo con el contenido de una matriz de bytes " ;:

Files.write(bytes, new File(path));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top