Hãy nghĩ đến một tệp đang được đọc. Có một kết thúc của luồng ở đó, kết thúc của tập tin. Nếu bạn cố gắng để đọc vượt ra ngoài đó, bạn chỉ đơn giản là không thể. Tuy nhiên, nếu bạn có kết nối mạng, bạn không cần phải kết thúc luồng nếu bạn chỉ cần đợi thêm dữ liệu để gửi.
Trong trường hợp tệp, chúng tôi biết thực tế là không có thêm dữ liệu để đọc. Trong trường hợp của một dòng mạng, chúng tôi (thường) không.
Chặn một FileReader
khi không có nhiều dữ liệu hơn là có sẵn, thức tỉnh khi có: câu trả lời đơn giản là: bạn không thể. Sự khác biệt cơ bản là bạn đọc một tập tin tích cực, nhưng khi bạn nghe một luồng mạng bạn đọc một cách thụ động. Khi có thứ gì đó xuất phát từ mạng, phần cứng của bạn gửi một tín hiệu ngắn đến Hệ điều hành, sau đó cung cấp dữ liệu mới cho JVM của bạn và JVM sẽ đánh thức quá trình của bạn để đọc dữ liệu mới (để nói). Nhưng chúng tôi không có điều đó với một tập tin, ít nhất là không phải ngay lập tức.
Cách giải quyết có thể là tạo một trình bao bọc cho StreamReader
bạn có, với trình nghe được thông báo khi tệp được thay đổi, sau đó sẽ đánh thức bạn đọc thêm. Trong Java 7, bạn có thể sử dụng WatchService
.
Nguồn
2013-12-18 02:27:37
Đọc tệp bằng FileInputStream. –
Thực thi chính xác hành vi nào? Bạn có nghĩa là để ngăn chặn các chương trình cho đến khi cái gì khác có sẵn? –
Nguyên nhân một Trình đọc trả về giá trị rỗng khi đọc từ luồng mạng với readLine(); – salbeira