2012-10-01 17 views
7

Eventuali duplicati:
Best Way to Write Bytes in the Middle of a File in JavaByte scritti in un file senza cancellare byte esistente

Ho un file in cui ho bisogno di scrivere byte.

So in quale posizione nel file è necessario inserire byte specifici. Per chiarire le cose, ho bisogno di scrivere byte nel mezzo del file senza cancellare alcun byte esistente. L'intera operazione dovrebbe quindi aumentare la lunghezza del file.

Qual è il modo migliore per farlo?

+0

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

+0

Già provato, sfortunatamente la mia implementazione non aggiunge byte ma cancella i byte esistenti, qual è il trucco per l'inserimento effettivo? –

+0

@gtgaxiola: Non funzionerà perché sovrascriverà i byte esistenti –

risposta

4

L'unico modo per farlo è spostare i byte che sono attualmente nel modo. A seconda della frequenza con cui si esegue questa operazione e di quanto è grande il file, è spesso consigliabile creare un nuovo file, copiare il file esistente e inserire i nuovi byte lungo la strada.

Se è necessario aggiornare il file di rado, o è di piccole dimensioni (fino a forse 100 kb) è possibile utilizzare una RandomAccessFile:

  1. estendere il file, utilizzando il metodo setLength(), aggiungendo il numero di byte che si inserirò tutto ciò che viene restituito dal metodo length().
  2. Se si dispone di memoria sufficiente, creare uno byte[] che manterrà tutti i byte dal punto di inserimento alla fine del file precedente.
  3. chiamata seek() per posizionare nel punto di inserimento
  4. chiamata readFully() per riempire l'array temporaneo
  5. chiamata seek() per posizionare nel punto di inserimento + il numero di byte da inserire
  6. chiamata write() per scrivere il buffer a quel punto
  7. chiamata seek() per riposizionare nel punto di inserimento
  8. chiamata `write() per scrivere il nuovo byte

Se non è possibile creare una matrice sufficientemente grande al punto 2, è necessario eseguire i passaggi 3-6 in un ciclo con un buffer più piccolo. Vorrei usare almeno un buffer da 64k per l'efficienza.

+0

+1 molto ben coperto. –