texto - printwriter java ejemplo
¿Es esta la mejor manera de reescribir el contenido de un archivo en Java? (7)
A menos que solo esté agregando contenido al final, es razonable hacerlo de esa manera. Si está anexando, intente con FileWriter con el constructor FileWriter .
Un orden un poco mejor sería:
- Genera un nuevo nombre de archivo (por ejemplo, foo.txt.new)
- Escribir contenido actualizado en un nuevo archivo.
- Hacer un cambio de nombre atómico de foo.txt.new a foo.txt
Desafortunadamente, renameTo no garantiza hacer un cambio de nombre atómico.
Quiero reescribir el contenido de un archivo.
Lo que he pensado hasta ahora es esto:
- Guarde el nombre del archivo
- Eliminar el archivo existente
- Crea un nuevo archivo vacío con el mismo nombre
- Escriba el contenido deseado en el archivo vacío
Es esta la mejor manera? ¿O hay una manera más directa, es decir, no tener que eliminar y crear archivos, sino simplemente cambiar el contenido?
En el siguiente ejemplo, el "falso" hace que el archivo se sobrescriba, verdadero podría causar 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 gran archivo vacío a fin de evitar el costo adicional de la asignación de espacio del sistema operativo según las necesidades. Esto generalmente se realiza mediante bases de datos, máquinas virtuales y también en programas por lotes que procesan y escriben datos masivos. 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 deberá llenarse. Es entonces cuando uno debe ir al modo de anulació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();
Recomiendo usar FileUtil de Apache Common para esto. He encontrado este paquete invaluable. Es fácil de usar e igualmente importante es fácil de leer / entender cuando retrocedes 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
Querrá 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");
Guava File.write "Sobrescribe un archivo con los contenidos de una matriz de bytes":
Files.write(bytes, new File(path));