Tôi có hai luồng. Một trong số chúng ghi vào PipedOutputStream, một cái khác đọc từ PipedInputStream tương ứng. Bối cảnh là một luồng đang tải xuống một số dữ liệu từ máy chủ từ xa và ghép nối nó với một số luồng khác thông qua các luồng đường ống.PipedInputStream - Cách tránh "java.io.IOException: Pipe broken"
Vấn đề là đôi khi (nhất là khi tải lớn (> 50Mb) files) tôi nhận được java.io.IOException: Ống chia khi cố gắng đọc từ PipedInputStream.
Javadoc nói rằng A pipe is said to be broken if a thread that was providing data bytes to the connected piped output stream is no longer alive.
Đúng vậy, chuỗi viết của tôi thực sự chết sau khi ghi tất cả dữ liệu của anh ấy vào PipedOutputStream.
Bất kỳ giải pháp? Làm thế nào tôi có thể ngăn PipedInputStream thoát khỏi ngoại lệ này? Tôi muốn để có thể đọc tất cả các dữ liệu đã được viết cho PipedOutputStream ngay cả khi viết thread hoàn thành công việc của mình. (Nếu có ai biết cách tiếp tục viết luồng cho đến khi tất cả dữ liệu được đọc, giải pháp này cũng được chấp nhận).
Tính năng tuyệt vời, chắc chắn +1, nhưng nó cần chia sẻ một phiên bản CountDownLatch giữa các chuỗi khác nhau. Điều này không phải là rất tốt, bởi vì viết và đọc chủ đề được tạo ra ở những nơi khác nhau và tôi muốn họ không biết về nhau. Kiến trúc của tôi bây giờ là như vậy mà họ biết chỉ có nên ghi/đọc đến/từ dòng nhất định. – levanovd
Sau đó, có thể bạn có thể mở rộng Piped [In | Out] putStream để xử lý thao tác của CountDownLatch. – Jerome
hoặc viết Input/OutputStream của riêng bạn để bao bọc ống và chốt (xem mã mẫu mà tôi đã thêm vào câu trả lời của tôi) – Jerome