2016-03-02 30 views
5

Czytam tekst z java BufferedReader tak:"zamknij" strumień?

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

To działa, ale po prostu wydaje się nieco niezdarny do mnie. Szkoda, że ​​nie było czegoś takiego jak .whenDone na Stream, tak, żebym mógł powiedzieć, aby zamknąć czytnik po tym, jak cała rzecz jest zużywana, a następnie po prostu zrobić .takeWhile(_ != null).

Czy jest jakiś sposób, o którym nie wiem? Lub, być może, lepszy sposób na uzyskanie strumienia linii z java Reader (jeśli byłby to InputStream, mógłbym na przykład zrobić Source.fromInputStream, ale nie wydaje się być odpowiednikiem dla Reader ... uwaga, że ​​to tylko częściowo rozwiązałoby problem, ponieważ można chcieć zrobić to samo z innymi "zamykanymi" obiektami - na przykład: ResultSet)?

Odpowiedz

1

można uzyskać zachowanie .whenDone poprzez dołączenie kolejnego Stream. Dzięki temu kod jest nieco bardziej wyrazisty i może być również użyty w innych przypadkach. Jest to coś, ale wydaje mi się, że nie jest to doskonałe.

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

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