2011-09-30 17 views
5

Qual è il modo più semplice per convertire un FileOutputStream in FileInputStream (una parte di codice sarebbe ottima)?FileOutputStream in FileInputStream

+4

Hai mai capito cosa stai chiedendo qui? Cosa intendi per "convertire"? Sono fondamentalmente cose opposte; uno è per la lettura e l'altro è per la scrittura. Stai cercando di leggere il file in cui stai scrivendo in "FileOutputStream"? –

+1

Che cosa esattamente vuoi fare? Un FileOutputStream scrive su un file e un FileInputStream legge da un file. Non riesco a vedere come il primo possa essere convertito in quest'ultimo. –

+0

Ricevo un FileOutputStream. Quello che voglio è leggerlo. – Pen

risposta

14

Questo potrebbe aiutare:

http://ostermiller.org/convert_java_outputstream_inputstream.html

Questo articolo cita 3 possibilità:

  • scrivere l'output completo in un array di byte poi leggerlo di nuovo
  • usa pipe
  • utilizzare un buffer di byte circolare (parte di una libreria ospitata su quella pagina)


Solo per riferimento, facendo il contrario (ingresso e uscita):

Una soluzione semplice con Apache Commons IO sarebbe:

IOUtils.copyLarge(InputStream, OutputStream) 

o se semplicemente vuole copiare un file:

FileUtils.copyFile(inFile,outFile); 

Se non si desidera utilizzare Apache Commons IO, ecco wha t il metodo copyLarge fa:

public static long copyLarge(InputStream input, OutputStream output) throws IOException 
{ 
    byte[] buffer = new byte[4096]; 
    long count = 0L; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
    output.write(buffer, 0, n); 
    count += n; 
    } 
    return count; 
} 
+1

Il collegamento è rotto, ma è ancora possibile trovare la risposta originale qui: https://web.archive.org/web /20110929161214/http://ostermiller.org/convert_java_outputstream_inputstream.html – GregT

1

Se è possibile utilizzare @Thomas esempio dato, altrimenti si può fare:

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 

public class FileInputOutputExample { 
    public static void main(String[] args) throws Exception { 

    InputStream is = new FileInputStream("in.txt"); 
    OutputStream os = new FileOutputStream("out.txt"); 
    int c; 
    while ((c = is.read()) != -1) { 
     System.out.print((char) c); 
     os.write(c); 
    } 
    is.close(); 
    os.close(); 

    } 
} 

esempio da java2s.com

EDIT:

Come @Thomas ha cancellato la sua risposta, aggiungerò solo per riferimento all'approccio IO di Commons per la gestione di questo:

IOUtils.copy(InputStream is, OutputStream os) 
+0

Non riesco a vedere come questo "converta un file FileOutputStream in un FileInputStream". –

+0

In realtà il mio esempio era il contrario (input per output), quindi l'ho eliminato. Se è ancora rilevante, potrei ripristinarlo come riferimento. – Thomas

+0

@Mark: è vero, ho appena pensato di voler leggere l'uno nell'altro – Kris

2

Se si intende che si desidera poter leggere il contenuto dopo aver scritto (senza eseguire il flush su disco), utilizzare un ByteArrayOutputStream e un ByteArrayInputStream. Una volta terminato di scrivere su ByteArrayOutputStream, è possibile ottenere i dati di byte sottostanti e utilizzare un ByteArrayInputStream per leggerlo di nuovo.

ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
// do any output onto outStream you need 
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray()); 
// you can read back the output with inStream now 

Se si desidera un buffer (produttore/consumatore tipo di problema riscontrato), esaminare i buffer forniti con il pacchetto nio di java.

4

Ricevo un FileOutputStream. Quello che voglio è leggerlo.

Non è possibile leggere da uno OutputStream. Penso che vuoi dire che vuoi leggere dal file che stai scrivendo dal FileOutputStream. Non penso che tu possa farlo neanche io. Il FileOutputStream non sembra mantenere un riferimento al file in fase di scrittura.

Quello che dovete fare è scoprire ciò che File o il percorso (un String) è stata approvata nel FileOutputStream e utilizzare lo stesso File o String per creare un nuovo FileInputStream.

+3

Penso che potrebbe usare FileOutputStream.getFD() per ottenere il FileDescriptor; di creare un FileInputStream attorno ad esso. Non sono sicuro se sia possibile leggere e scrivere contemporaneamente dallo stesso FileDescriptor. –

+0

@ S.L.Barth: buon punto, in realtà l'avevo esaminato, ma ho perso il fatto che 'FileInputStream' ha un costruttore che accetta un' FileDescriptor'. –

Problemi correlati