Domanda

Esiste un linguaggio più conciso / standard (ad esempio un metodo JDK) per "piping" un input per un output in Java rispetto al seguente?

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] Nota Reader e Writer sono dati . La risposta corretta dimostrerà come prendere in e out e formare una pipe (preferibilmente con non più di 1 o 2 chiamate di metodo). Accetterò risposte in cui in e out sono un InputStream e un OutputStream (preferibilmente con una conversione da / a Reader / Writer ). Non accetterò risposte se in o out è una sottoclasse di Reader / InputStream o Writer / OutputStrem .

È stato utile?

Soluzione

IOUtils del progetto Apache Commons ha un numero di metodi utili che fanno esattamente ciò di cui hai bisogno.

IOUtils.copy (in, out) eseguirà una copia bufferizzata di tutto l'input nell'output. Se nella tua base di codice è presente più di un punto che richiede la gestione di Stream o Reader / Writer , usare IOUtils potrebbe essere una buona idea.

Altri suggerimenti

Dai un'occhiata a java.io.PipedInputStream e PipedOutputStream , oppure PipedReader / PipedWriter dallo stesso pacchetto.

Dalla documentazione di PipedInputStream:

Un flusso di input convogliato deve essere collegato a un flusso di output convogliato; il flusso di input convogliato fornisce quindi tutti i byte di dati scritti nel flusso di output convogliato. 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. Non è consigliabile tentare di utilizzare entrambi gli oggetti da un singolo thread, poiché potrebbe bloccare il thread. Il flusso di input convogliato contiene un buffer che disaccoppia le operazioni di lettura dalle operazioni di scrittura, entro certi limiti. Si dice che una pipe sia rotta se un thread che stava fornendo byte di dati al flusso di output di pipe collegato non è più attivo.

L'unica ottimizzazione disponibile è tramite FileChannels nell'API NIO: Read , Scrive . JVM può ottimizzare questa chiamata per spostare i dati da un file a un canale di destinazione senza prima dover spostare i dati nello spazio del kernel. Vedi questo articolo per i dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top