2012-03-04 24 views
6

Sto provando a scrivere una funzione che accetta i parametri Oggetto file, offset e matrice di byte e scrive quell'array di byte in un oggetto File in Java.Java OutputStream Skip (offset)

Quindi la funzione sarà simile

public void write(File file, long offset, byte[] data) 

Ma il problema è che il parametro offset è di tipo lungo, quindi non posso usare la funzione write() di OutputStream, che prende intero come un offset.

A differenza di InputStream, che ha saltato (lungo), sembra che OutputStream non abbia modo di saltare i primi byte del file.

C'è un buon modo per risolvere questo problema?

Grazie.

+0

Il numero più grande che si può inserire in un 'int' è 2.147.483.647. Gli array che vuoi scrivere sono più grandi di + - 2 GB? –

+0

Solo per chiarimenti: l'offset si applica solo alla posizione nell'array *, non al flusso di output, giusto? Con un OutputStream non puoi saltare posizioni. –

+0

@TheNail offset si riferisce all'offset dall'inizio del file, non all'inizio della matrice. E a meno che tu non stia usando FAT come un file system puoi effettivamente avere file più grandi di 2Gb. – Dunes

risposta

11
try { 
    FileOutputStream out = new FileOutputStream(file); 
    try { 
     FileChannel ch = out.getChannel(); 
     ch.position(offset); 
     ch.write(ByteBuffer.wrap(data)); 
    } finally { 
     out.close(); 
    } 
} catch (IOException ex) { 
    // handle error 
} 
4

Che ha a che fare con la semantica dei flussi. Con un flusso di input stai solo dicendo che stai scartando i primi n byte di dati. Tuttavia, con un OutputStream qualcosa deve essere scritto per lo streaming. Non si può semplicemente chiedere che il flusso pretenda che siano stati scritti n byte di dati, ma in realtà non li scrive. La ragione di ciò è perché non tutti i flussi saranno ricercabili. I dati provenienti da una rete non sono ricercabili: si ottengono i dati una volta sola. Tuttavia, non è così con i file perché sono memorizzati su un disco rigido ed è facile cercare in qualsiasi posizione sul disco rigido.

Soluzione: utilizzare FileChannels o RandomAccessFile sottopiano.

1

Se si desidera scrivere alla fine del file quindi utilizzare la modalità di aggiunta (FileOutputStream (String name, aggiungere booleano)). A mio modesto parere, ci dovrebbe essere un metodo di salto in FileOutputStream, ma per ora se si desidera spostarsi in una posizione specifica in un file per la scrittura, è necessario utilizzare il FileChannel ricercabile o RandomAccessFile (come era menzionato da altri).

Problemi correlati