Hay una forma de anteponer una línea en el Archivo de Java, sin crear un archivo temporal, y escribir el contenido necesario para que?

InformationsquelleAutor folone | 2010-03-29

6 Comentarios

  1. 20

    No, no hay manera de hacer que de forma SEGURA en Java.

    Ningún sistema de archivos de la aplicación en cualquier sistema operativo de uso general admite este tipo de cosas, y usted no encontrará esta característica se admite en lenguajes de programación.

    Mundo Real archivo de la aplicación de los sistemas en los dispositivos que almacenan datos de tamaño fijo «bloques». No es posible implementar un sistema de archivo de modelo donde se puede insertar de bytes en el medio de un archivo sin reduciendo significativamente el archivo de e/S, desperdiciando espacio en disco o ambos.


    Las soluciones que implican una reescritura del archivo son inherentemente inseguros. Si su aplicación está muerto o el poder muere en medio de la prepend /reescritura de proceso, que son propensos a perder los datos. Yo NO recomendaría el uso que se enfoque en la práctica.

    Utilizar un archivo temporal. Es más seguro.

    • Como ya se dijo, no es seguro(OS/sistema de archivos/dispositivo dependiente), pero el uso de la memoria asignada enfoque, ya que parte de el archivo puede ser modificado como una matriz de bytes, en lugar de reemplazar que se puede hacer. Pero esto es también limita sólo a la «colocación» de bytes, no «anteponiendo el/la inserción de» bytes adicionales.
    • Correcto. Pero la Pregunta es explícitamente sobre anteponiendo una línea de un archivo. Y que lo que mi Respuesta es abordar.
  2. 6

    Hay una manera, implica la reescritura de todo el archivo, aunque (pero ningún archivo temporal). Como han mencionado otros, ningún sistema de archivos admite anteponiendo el contenido a un archivo. Aquí está el código de ejemplo que utiliza un RandomAccessFile a escribir y a leer el contenido, manteniendo algunos de los contenidos que se han almacenado en la memoria:

    public static void main(final String args[]) throws Exception {
    File f = File.createTempFile(Main.class.getName(), "tmp");
    f.deleteOnExit();
    System.out.println(f.getPath());
    //put some dummy content into our file
    BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
    for (int i = 0; i < 1000; i++) {
    w.write(UUID.randomUUID().toString());
    w.write('\n');
    }
    w.flush();
    w.close();
    //append "some uuids" to our file
    int bufLength = 4096;
    byte[] appendBuf = "some uuids\n".getBytes();
    byte[] writeBuf = appendBuf;
    byte[] readBuf = new byte[bufLength];
    int writeBytes = writeBuf.length;
    RandomAccessFile rw = new RandomAccessFile(f, "rw");
    int read = 0;
    int write = 0;
    while (true) {
    //seek to read position and read content into read buffer
    rw.seek(read);
    int bytesRead = rw.read(readBuf, 0, readBuf.length);
    //seek to write position and write content from write buffer
    rw.seek(write);
    rw.write(writeBuf, 0, writeBytes);
    //no bytes read - end of file reached
    if (bytesRead < 0) {
    //end of
    break;
    }
    //update seek positions for write and read
    read += bytesRead;
    write += writeBytes;
    writeBytes = bytesRead;
    //reuse buffer, create new one to replace (short) append buf
    byte[] nextWrite = writeBuf == appendBuf ? new byte[bufLength] : writeBuf;
    writeBuf = readBuf;
    readBuf = nextWrite;
    };
    rw.close();
    //now show the content of our file
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
    String line;
    while ((line = reader.readLine()) != null) {
    System.out.println(line);
    }
    }
  3. 0

    Se puede almacenar el contenido del archivo en una Cadena y anteponer la línea deseada mediante el uso de StringBuilder-Objeto. Solo tienes que poner la primera línea deseada y, a continuación, agregue el archivo de contenido de la Cadena.

    Ningún archivo temporal necesaria.

    • Que habría que reemplazar el archivo existente de contenido con la nueva. No cambiaría el archivo en su lugar al mover el contenido en el sistema de archivos y poner el nuevo contenido antes, que es lo que la pregunta para.
  4. 0

    Sería posible hacerlo mediante la lectura de un fragmento del archivo de longitud igual a lo que se quiere anteponer, escribir el nuevo contenido en lugar de eso, después de leer el fragmento y reemplazarlo con lo que has leído antes, y así sucesivamente, ondulación hacia abajo al final del archivo.

    Sin embargo, no hay que hacerlo, porque si algo deja de (fuera-de-la memoria, la interrupción de la alimentación, pícaro hilo de llamadas System.exit) en el medio de ese proceso, los datos se perderán. Utilice el archivo temporal en su lugar.

  5. -1
    private static void addPreAppnedText(File fileName) {
    FileOutputStream fileOutputStream =null;
    BufferedReader br = null;
    FileReader fr = null;
    String newFileName = fileName.getAbsolutePath() + "@";
    try {
    fileOutputStream = new FileOutputStream(newFileName);
    fileOutputStream.write("preappendTextDataHere".getBytes());
    fr = new FileReader(fileName);
    br = new BufferedReader(fr);
    String sCurrentLine;
    while ((sCurrentLine = br.readLine()) != null) {
    fileOutputStream.write(("\n"+sCurrentLine).getBytes());
    }
    fileOutputStream.flush();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    fileOutputStream.close();
    if (br != null)
    br.close();
    if (fr != null)
    fr.close();
    new File(newFileName).renameTo(new File(newFileName.replace("@", "")));
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    }
    }
    • Sólo el código de respuesta. Y se crea un segundo archivo, por lo que no está haciendo lo que el OP quiere.

Dejar respuesta

Please enter your comment!
Please enter your name here