2012-03-05 5 views
5

Attualmente sto utilizzando uno stream bufferizzato per leggere scrivere alcuni file. In mezzo faccio qualche elaborazione matematica in cui un simbolo è un byte.Prestazioni di DataInputStream DataOutputStream

Per leggere:

InputStream input = new FileInputStream(outputname) 
input.read(byte[] b,int off,int len) 

Per scrivere:

OutputStream output = new BufferedOutputStream(
          new FileOutputStream(outputname), 
          OUTPUTBUFFERSIZE 
         ) 
output.write((byte)byteinsideaint); 

Ora ho bisogno di aggiungere alcuni dati di intestazione, e per sostenere i simboli brevi troppo. Voglio utilizzare DataInputStream e DataOutputStream per evitare di convertire altri tipi di byte in me stesso e mi chiedo se qual è la loro prestazione.

cosa ho bisogno per usare

OutputStream output = new DataOutputStream(
          new BufferedOutputStream(
            new FileOutputStream(outputname), 
            OUTPUTBUFFERSIZE 
          ) 
         ); 

per mantenere i vantaggi del buffer di dati o è abbastanza buono da utilizzare

OutputStream output = new DataOutputStream(
          new FileOutputStream(outputname) 
         ) 

risposta

7

Si dovrebbe aggiungere BufferedOutputStream in mezzo. DataOutputStream non implementa alcun caching (che è buono: separazione dei problemi) e le sue prestazioni saranno molto scarse senza mettere in cache il sottostante OutputStream. Anche i metodi più semplici come writeInt() possono comportare quattro scritture disco separate.

Per quanto posso vedere, solo write(byte[], int, int) e writeUTF(String) scrivono dati in un blocco byte[]. Altri scrivono valori primitivi (come int o double) byte per byte.

+0

Questo ha totalmente aiutato la mia giornata. Grazie ^^ – Lake

1

È assolutamente necessario BufferedOutputStream nel mezzo.

Apprezzo la sua preoccupazione per le prestazioni, e ho 2 suggerimenti:

  1. Shrink i flussi con la compressione Java. L'articolo utile può essere trovato here.
  2. Utilizzare la composizione anziché l'ereditarietà (operazione consigliata comunque). Crea un pipe che contiene un PipedInputStream e un PipedOutputStream connessi tra loro, con i metodi getInputStream() e getOutputStream(). Non puoi passare direttamente l'oggetto Pipe a qualcosa che ha bisogno di un flusso, ma puoi passare il valore di ritorno di esso metodi per farlo
+0

Grazie. In base ai requisiti del mio compito, non devo comprimere con forza – UmNyobe

+0

GZip * Lo stream ha enormi problemi in java, anche se utilizza molta memoria attraverso le chiamate native. LZ-4 è probabilmente migliore. – claj