2012-03-28 13 views
11

Ho una chiamata API che restituisce un array di byte. Attualmente sto trasmettendo il risultato in un array di byte, quindi assicurati che i checksum corrispondano e quindi scriva ByteArrayOutputStream su File. Il codice è qualcosa di simile e funziona piuttosto bene.Come scrivere un InputStream potenzialmente enorme su File?

String path = "file.txt"; 
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 
    int len = 0; 
    while ((len = inputStream.read(buffer)) != -1) { 
     byteBuffer.write(buffer, 0, len); 
    } 
    FileOutputStream stream = new FileOutputStream(path); 
    stream.write(byteBuffer.toByteArray()); 

La mia preoccupazione io che il risultato da InputStream potrebbe potenzialmente essere più grande della dimensione heap in Android e ho potuto ottenere eccezioni OutOfMemory se l'intero array di byte è in memoria. Qual è il modo più elegante per scrivere inputStream in file in blocchi, in modo tale che l'array di byte non sia mai più grande della dimensione heap?

+0

suggerisci che la mia preoccupazione è irrilevante? – JoeLallouz

+1

Basta eliminare l'uso di 'ByteArrayOutputStream'. (Ho letto male ... il mio uso del tutto?) –

risposta

10

sono andato con il consiglio di saltare la ByteArrayOutputStream e scrivere il FileOutputStream e questo sembra per affrontare le mie preoccupazioni. Con una regolazione rapida, dove FileOutputStream è decorato da un BufferedOutputStream

String path = "file.txt"; 
OutputStream stream = new BufferedOutputStream(new FileOutputStream(path)); 
int bufferSize = 1024; 
byte[] buffer = new byte[bufferSize]; 
int len = 0; 
while ((len = is.read(buffer)) != -1) { 
    stream.write(buffer, 0, len); 
} 
if(stream!=null) 
    stream.close(); 
+0

non è 'dovrebbe essere' FileInputStream'? Non è definito –

+1

qual è il vantaggio di utilizzare BufferedOutputStream invece di utilizzare direttamente FileOutputStream? – Xan

14

Non scrivere su ByteArrayOutputStream. Scrivi direttamente allo FileOutputStream.

String path = "file.txt"; 
FileOutputStream output = new FileOutputStream(path); 
int bufferSize = 1024; 
byte[] buffer = new byte[bufferSize]; 
int len = 0; 
while ((len = inputStream.read(buffer)) != -1) { 
    output.write(buffer, 0, len); 
} 
+0

hmmm immagino che abbia senso. – JoeLallouz

+0

Sono andato con questo Output Output output = new BufferedOutputStream (nuovo FileOutputStream (percorso)); dopo aver letto i documenti FileOutputStream. – JoeLallouz

+0

Sentiti libero di modificare la mia risposta per riflettere questo e accettarlo. Altrimenti, puoi/dovrebbe pubblicare e accettare la tua risposta. –

Problemi correlati