2016-03-02 18 views
5

sto leggendo il testo da un java BufferedReader come questo:"chiudi" un flusso?

Stream.continually(reader.readLine).takeWhile { 
    case null => reader.close; false 
    case _ => true 
} 

Questo funziona, ma sembra solo un po 'goffo per me. Vorrei che ci fosse qualcosa come .whenDone su Stream, in modo che potessi dire di chiudere il lettore dopo che l'intera cosa è stata consumata, e quindi basta fare .takeWhile(_ != null).

C'è un modo per farlo che non conosco? O forse un modo migliore per ottenere un flusso di linee da un java Reader (se fosse un InputStream, potrei semplicemente fare Source.fromInputStream per esempio, ma non sembra essere un equivalente per Reader ... nota che questo risolverebbe solo parzialmente il problema, perché si potrebbe voler fare la stessa cosa con altri oggetti "chiudibili" - ad esempio ResultSet)?

risposta

1

È possibile ottenere il comportamento .whenDone aggiungendo un altro Stream. Questo rende il codice un po 'più espressivo e potrebbe essere utilizzato anche in altri casi. È qualcosa ma credo lontano dall'essere perfetto.

def closeStream: Stream[Nothing] = { 
    reader.close 
    Stream.Empty 
} 

Stream.continually(reader.readLine).takeWhile(_ != null) #::: closeStream