2009-06-19 12 views
36

Quiero reescribir el contenido de un archivo.¿Es esta la mejor manera de reescribir el contenido de un archivo en Java?

Lo que he pensado hasta ahora es la siguiente:

  1. Guardar el nombre del archivo
  2. Borrar el archivo existente
  3. Crear un nuevo archivo vacío con el mismo nombre
  4. Escribir 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?

Respuesta

70

Para sobrescribir foo.log archivo 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(); 
+0

@Ankur: sí. Depende de si está escribiendo cadenas o elementos binarios en bytes en cuanto a si usaría el enfoque OutputStream o Writer. – Stobor

+0

¿Hay algún método disponible para el escritor de archivos PDF sin cambiar su nombre? – BobDroid

+0

@BabuThangavel No estoy seguro de lo que está preguntando, pero parece que no está relacionado con esta pregunta ... ¿Quizás quiera hacer una nueva pregunta? – Stobor

2

A menos que estés sólo añadir contenido al final, que es razonable hacerlo de esa manera. Si va a agregar, intente FileWriter con el constructor adjunto.

Un poco mejor orden sería:

  1. generan el nuevo nombre del archivo (por ejemplo foo.txt.new)
  2. escribir el contenido actualizado a un nuevo archivo.
  3. Haz renombrar atómica de foo.txt.new a foo.txt

Por desgracia, es renameTo not guaranteed que hacer cambio de nombre atómica.

4

Ver: java.io.RandomAccessFile

Usted 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"); 
+0

He leído mal la pregunta ya que es necesario volver a escribir un archivo, p. modifique los contenidos, no los reemplace por completo con contenido nuevo. – drfloob

+0

Cualquiera resolverá el problema :) – Ankur

+0

De todos modos, estaba buscando sobreescribir una parte específica del archivo y esta fue la respuesta! – fyts

1

En el siguiente ejemplo, el "falso" hace que el archivo se sobrescriba, ciertos, causa lo opuesto.

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(); 
+1

¡Curioso! ¿Cuál es el beneficio de la introducción de DataOutputSteam? –

+0

Los métodos size() y writeUTF() me han sido útiles hasta ahora, así que elegí usar eso. Tampoco puede convertir a bytes antes de escribir la cadena utilizando DataOutputStream. – Sev

+0

DataInputStream y DataOutputStream son clases especializadas para trabajar con cierto tipo de archivo binario; no deberían usarse en archivos de texto. La forma correcta de leer y escribir archivos de texto es con Lectores y Escritores: FileReader y FileWriter usan la codificación predeterminada de la plataforma, mientras que InputStreamReader y OutputStreamWriter le permiten especificar la codificación (como UTF-8). –

10

Recomiendo encarecidamente utilizar el 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); 

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

1

Hay momentos en que uno puede querer mantener un archivo vacío enorme, así como para evitar un costo adicional del sistema operativo la asignación de espacio en función de 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.

1

GuavaFile.write "sobrescribe un archivo con el contenido de una matriz de bytes":

Files.write(bytes, new File(path)); 
Cuestiones relacionadas