2012-10-01 23 views
7

Duplicar posible:
Best Way to Write Bytes in the Middle of a File in JavaBytes de escritura en un archivo sin borrar bytes existentes

Tengo un archivo en el que tengo que escribir bytes.

Sé en qué posición del archivo necesito inserte bytes específicos. Para aclarar las cosas, necesito escribir bytes en el medio del archivo sin borrar ningún byte existente. Toda la operación debería aumentar la longitud del archivo.

¿Cuál es la mejor manera de hacerlo?

+0

http://stackoverflow.com/questions/181408/best-way-to-write-bytes-in-the-middle-of-a-file-in-java – gtgaxiola

+0

Ya intenté, desafortunadamente mi implementación no agrega bytes pero borre los bytes existentes, ¿cuál es el truco para insertar realmente? –

+0

@gtgaxiola: Eso no funcionará porque sobrescribirá los bytes existentes –

Respuesta

4

La única forma de hacerlo es mover los bytes que están actualmente en el camino. Dependiendo de la frecuencia con la que tenga que hacer esto y del tamaño del archivo, a menudo es una mejor idea crear un nuevo archivo, copiar el archivo existente e insertar los nuevos bytes en el camino.

Si necesita actualizar el archivo con poca frecuencia, o que es pequeño (hasta quizás 100 kb) se puede utilizar un RandomAccessFile:

  1. Extender el archivo, utilizando el método setLength(), añadiendo el número de bytes que Estaremos insertando a lo que devuelve el método length().
  2. Si tiene suficiente memoria, cree un byte[] que contendrá todos los bytes desde el punto de inserción hasta el final del archivo.
  3. llamada seek() a posicionar en el punto de inserción
  4. llamada readFully() para llenar su matriz temporal
  5. llamada seek() a posicionar en el punto de inserción + el número de bytes para insertar
  6. llamada write() para escribir su memoria intermedia en ese punto
  7. llamada seek() para reposicionar en el punto de inserción
  8. llamada `escritura() para escribir el nuevo bytes

Si no puede crear una matriz lo suficientemente grande en el paso 2, tendrá que realizar los pasos 3 a 6 en un bucle con un búfer más pequeño. Usaría al menos un buffer de 64k para la eficiencia.

+0

+1 muy bien cubierto. –

Cuestiones relacionadas