Es esta la mejor manera para volver a escribir el contenido de un archivo en Java?

Quiero volver a escribir el contenido de un archivo.

Lo que he pensado hasta ahora es este:

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

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

InformationsquelleAutor Ankur | 2009-06-19

7 Kommentare

  1. 81

    Para sobrescribir el archivo foo.registro 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();
    • sí. Depende de si usted está escribiendo o cadenas binarias cosas en bytes si desea utilizar el OutputStream o el Escritor enfoque.
    • ¿Hay algún método disponible para el archivo pdf writer sin cambiar su nombre?
    • No estoy seguro de lo que estás preguntando, pero no parece estar relacionada con esta pregunta… tal vez usted quiere hacer una nueva pregunta?
    • ¿Usted necesita para cerrar el Archivo objeto después de que se cierre el FileWriter?
    • Java File objetos no son abiertos, por lo que no necesita ser cerrado… Ver las respuestas a stackoverflow.com/q/4752266/43452
    • si el contenido anterior era más grande que el nuevo contenido, es el material adicional elimina o se va a encontrar al final del archivo después de la escritura en menos de lo que debería haber sido eliminado.
    • si no se especifica ningún valor, va a ser falso y va a sobrescribir el archivo antiguo
    • Gracias por los ajustes @pmartin8

  2. 12

    Recomiendo usando el Apache Común del FileUtil para esto. He encontrado este paquete de valor incalculable. Es fácil de usar e igual de importante, es fácil de leer/entender al volver un tiempo después.

    //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

  3. 5

    Ver: java.io.RandomAccessFile

    Usted desea abrir un Archivo de lectura y escritura, así:

    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");
    • No entendí la pregunta como de la necesidad de reescribir un archivo, por ejemplo, modificar los contenidos, a no sustituir completamente con el nuevo contenido.
    • De todos modos, yo estaba buscando a sobrescribir una parte específica del archivo y esta fue la respuesta!
  4. 2

    A menos que usted está a solo agregar contenido al final, es razonable hacerlo de esa manera. Si usted está añadiendo, intente FileWriter con el append constructor.

    Un poco mejor orden sería:

    1. Generar nuevo nombre de archivo (por ejemplo, foo.txt.nuevo)
    2. Escribir el contenido que se actualiza a un nuevo archivo.
    3. Hacer atómica cambiar el nombre de foo.txt.nuevo foo.txt

    Por desgracia, renameTo es no se garantiza hacer atómica cambiar el nombre.

  5. 1

    En el ejemplo de abajo, el «falso» hace que el archivo se sobrescribe, verdad harí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(); 
    • Curioso! ¿cuál es el beneficio de introducir DataOutputSteam?
    • El tamaño() y writeUTF() métodos han sido útiles para mí hasta el momento, así que decidí usar que. Usted también no puede convertir en bytes antes de escribir la cadena mediante DataOutputStream.
    • DataInputStream y DataOutputStream son clases especializadas para trabajar con un determinado tipo de archivo binario; que no debe ser utilizado en archivos de texto. La forma correcta de leer y escribir archivos de texto con los Lectores y Escritores: FileReader y FileWriter el uso de la plataforma de codificación predeterminada, mientras que InputStreamReader y OutputStreamWriter permiten especificar la codificación (como UTF-8).
  6. 1

    Hay veces cuando uno lo desea, puede mantener a un enorme archivo vacío a fin de evitar costos adicionales de la OS la asignación de espacio en la necesidad. Esto se hace generalmente por las bases de datos, máquinas Virtuales y también en lotes de los programas de ese proceso y escribir datos de forma masiva. Esto mejoraría el rendimiento de la aplicación de manera significativa. En estos casos, la escritura de un nuevo archivo y cambiarle el nombre, no iba a ayudar de verdad. En su lugar, el archivo vacío tendrá que ser llenado. Eso es cuando uno debe ir para el modo de sobrecontrol.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea