2008-09-24 19 views
9

Esiste un idioma più conciso/standard (ad es. Un metodo JDK) per "convogliare" un input per un'uscita in Java rispetto al seguente?Idioma Java per "piping"

 
public void pipe(Reader in, Writer out) { 
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); 
    while(in.read(buf) >= 0) { 
     out.append(buf.flip()); 
     buf.clear(); 
    } 
} 

[EDIT] Si prega di notare la Reader e Writer sono dato. La risposta corretta mostrerà come prendere in e out e formare una pipe (preferibilmente con non più di 1 o 2 chiamate di metodo). Accetterò le risposte in cui in e out sono un InputStream e un OutputStream (preferibilmente con una conversione da/a Reader/Writer). Non accetterò le risposte in cui in o out è una sottoclasse di Reader/InputStream o Writer/OutputStrem.

+0

possibile duplicato di [Modo semplice per scrivere il contenuto di un Java InputStream in un OutputStream] (http://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream -a-un-uscita) –

risposta

10

dal progetto Apache Commons ha un numero di utilily methods che fa esattamente quello che ti serve.

IOUtils.copy(in, out) eseguirà una copia bufferizzata di tutti gli input dell'output. Se nella basebase è presente più di un punto che richiede la gestione di Stream o Reader/Writer, utilizzare IOUtil potrebbe essere una buona idea.

+0

Wow. Apache Commons è un progetto davvero impressionante. Mi graffiano tutti i pruriti prima ancora che li noti. –

+0

+1 per Apache Commons –

1

Date un'occhiata a java.io.PipedInputStream e PipedOutputStream, o PipedReader/PipedWriter dallo stesso package.

Dalla documentazione di PipedInputStream:

Un convogliato flusso di ingresso deve essere collegato ad un flusso di output convogliato; il flusso di input collegato in pipe fornisce quindi tutti i byte di dati scritti sul flusso di output collegato. In genere, i dati vengono letti da un oggetto PipedInputStream da un thread e i dati vengono scritti nel PipedOutputStream corrispondente da qualche altro thread. Si sconsiglia di tentare di utilizzare entrambi gli oggetti da un singolo thread, poiché potrebbe causare il deadlock del thread. Il flusso di input con pipe contiene un buffer, che disaccoppia le operazioni di lettura dalle operazioni di scrittura, entro i limiti. Si dice che una pipe sia danneggiata se un thread che forniva byte di dati al flusso di output collegato in pipe non è più attivo.

+0

C'è un modo per costruire un PipedInputStream da un determinato InputStream (o Reader)? –

+0

Credo che si possa fare qualcosa come "nuovo PipedInputStream (theInputStreamInstance)" (cioè "wrap InputStream con un PipedInputStream). –

+0

Mi dispiace, ho saltato prima che guardassi. :(Sembra che non ci sia modo di prendere uno stream esistente e girarlo un PipedInputStream deve essere collegato a un PipedOutputStream. Se lo si desidera, è possibile trasferire i byte da un InputStream a un PipedOutputStream collegato a un PipedInputStream. –

1

L'unica ottimizzazione disponibile è tramite FileChannel nell'API NIO: Reads, Writes. La JVM può ottimizzare questa chiamata per spostare i dati da un file a un canale di destinazione senza dover prima spostare i dati nello spazio del kernel. Vedi this article per i dettagli.

+0

Come ottenere un FileChannel da Reader, Writer, InputStream o OutputStream? –