Restituzione di un input Steam consente di eseguire il calcolo su base continuativa man mano che i dati vengono letti, potenzialmente anche in un thread separato. È equivalente a un pipe della riga di comando di Unix. Se l'elaborazione impiega un tempo significativo per il completamento, questo nasconde efficacemente il tempo di elaborazione all'utente distribuendolo (o spostandolo in un altro core) e restituendo i risultati un po 'alla volta. Puoi facilmente costruire più fasi di trasformazione.
Quando si passa un flusso di output, è come usare il vecchio prompt dei dos pre-windows: bene se tutto ciò che si sta facendo è inviare i dati direttamente all'utente, ma se non lo si dovrà memorizzare temporaneamente da qualche parte (o un file o un ByteArrayOutputStream) prima di continuare l'elaborazione. Ciò introdurrà ritardi prima che venga prodotto qualsiasi output, rende più vantaggioso l'uso di più core e utilizza risorse inutilmente.
Inoltre, dichiari che esiste una regola generale che l'apertura di uno stream dovrebbe chiuderla, ma non penso che questa sia la regola completa. Credo che la regola che il sistema di I / O java sia costruito è meglio che "l'apripista di un flusso dovrebbe essere responsabile della sua chiusura, a meno che non sia successivamente avvolto in un altro oggetto che fornisce anche un metodo vicino, nel qual caso l'apri dovrebbe chiama invece quel metodo, che dovrebbe quindi chiudere il flusso originale per conto dell'apertore. " Questo è quello che fai, ad esempio, quando usi un BufferedInputStream.
Tutto ciò suggerisce che il primo dovrebbe essere generalmente preferito, ma vale la pena notare che per molte trasformazioni complesse, quest'ultimo è molto più facile da implementare (supponendo che non si desideri utilizzare più thread). In alcuni casi questo può essere a favore del primo, ma si noti che se si preferisce una soluzione multithread, il codice in quest'ultimo stile può essere adattato all'interfaccia precedente inserendo il proprio thread e utilizzando una coppia di stream Piped * per la comunicazione. Quindi direi che, oltre a casi molto semplici, il primo è il migliore, ma quest'ultimo potrebbe essere accettabile e più semplice se si ha un caso semplice e / o non si vuole essere coinvolti con i thread.