2016-03-02 14 views
5

Tôi đọc văn bản từ một java BufferedReader như thế này:"đóng" một luồng?

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

này hoạt động, nhưng chỉ có vẻ một chút vụng về với tôi. Tôi muốn có một cái gì đó như .whenDone trên Stream, để tôi có thể yêu cầu nó đóng trình đọc sau khi toàn bộ điều được tiêu thụ, và sau đó chỉ cần .takeWhile(_ != null).

Có cách nào để làm điều đó mà tôi không biết? Hoặc, có lẽ, một cách tốt hơn để có được một dòng các dòng từ một java Reader (nếu nó là một InputStream, tôi chỉ có thể làm Source.fromInputStream ví dụ, nhưng có vẻ không tương đương với Reader ... lưu ý, rằng điều này sẽ chỉ giải quyết một phần vấn đề, bởi vì người ta có thể muốn làm điều tương tự với các đối tượng "có thể đóng" khác - ví dụ: ResultSet)?

Trả lời

1

Bạn có thể nhận được hành vi .whenDone bằng cách thêm một số khác Stream. Điều này làm cho mã một chút biểu cảm hơn và cũng có thể được sử dụng trong các trường hợp khác. Đó là một cái gì đó nhưng tôi đoán xa hoàn hảo.

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

Stream.continually(reader.readLine).takeWhile(_ != null) #::: closeStream 
Các vấn đề liên quan