Poiché gli stream che richiedono il rilascio esplicito di risorse sono in realtà un caso piuttosto insolito. Quindi abbiamo scelto di non sovraccaricare l'esecuzione di streaming con qualcosa che è valido solo per lo 0,01% degli usi.
Abbiamo fatto flusso Autocloseable in modo che sia possibile risorse liberazione dalla fonte, se si vuole, ma questo è dove ci siamo fermati, e per una buona ragione.
Non solo farebbe questo automaticamente a carico della maggior parte degli utenti con un lavoro extra di cui non hanno bisogno, ma ciò violerebbe anche un principio generale: colui che assegna la risorsa è responsabile della chiusura della risorsa. Quando si chiama
BufferedReader reader = ...
reader.lines().op().op()...
si sta aprendo la risorsa, non la libreria torrente l'uno e si dovrebbe chiuderlo. Infatti, poiché chiudere un flusso risultante dalla chiamata di un metodo di accesso su un oggetto che tiene risorse a volte chiude l'oggetto sottostante, probabilmente non vuoi che lo streaming chiuda il BufferedReader
per te - potresti voler che rimanga aperto dopo il chiamata.
Se si desidera chiudere la risorsa, questo è troppo facile:
try (BufferedReader reader = ...) {
reader.lines().op()...
}
Probabilmente stai utilizzando i flussi in modo particolare, quindi probabilmente sembra "evidente" che cosa flussi dovrebbe fare - ma ci sono più casi d'uso là fuori che i tuoi. Quindi, piuttosto che ricorrere a casi d'uso specifici, ci siamo avvicinati dal principio generale: se hai aperto il flusso e lo vuoi chiuso, chiudilo da solo, ma se non lo hai aperto, non è per te che devi chiudere.
fonte
2015-03-02 15:55:30
cosa intendi per "operazione terminale"? –
Penso che stai mescolando 'java.io.InputStream' con' java.util.stream.Stream', che sono due concetti molto molto diversi –
@ Zoltán no, sto davvero parlando di 'java.util.Stream' che è "AutoCloseable" e quindi idoneo per l'uso all'interno di "try-with-resources". @MartinSerrano Ho aggiunto un collegamento alla documentazione di Java riguardante i flussi in generale e le operazioni del terminale in particolare. –