2013-12-18 19 views
5

Tôi luôn tự hỏi: Kết thúc luồng là gì?Luồng đầu vào/đầu ra: Kết thúc luồng?

Trong javadoc của hầu hết các phương thức readLine trong gói java.io, bạn có thể đọc "điều này trả về null nếu kết thúc luồng" - mặc dù tôi chưa bao giờ có giá trị rỗng, vì hầu hết các luồng (trong trường hợp của luồng mạng mà tôi sử dụng thường xuyên nhất) chỉ chặn thực thi chương trình cho đến khi có nội dung nào đó được ghi vào luồng trên đầu từ xa

Có cách nào để thực thi hành vi này không? Tôi chỉ đơn giản là tò mò ...

+0

Đọc tệp bằng FileInputStream. –

+0

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? –

+0

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

Trả lời

8

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.

+0

Tôi thực sự quản lý để có được người đọc trả về null bằng cách đóng socket trên đầu cuối - rõ ràng là dòng kết thúc, nhưng cũng là một chỉ báo đang được thiết lập để nói bất cứ điều gì cố gắng đọc từ nó rằng nó đã kết thúc theo nghĩa đen (để nhận dữ liệu) ... Đây là thời điểm tôi đã chờ để chèn mã dọn dẹp khi kết thúc từ xa đóng kết nối! – salbeira

+0

Bạn có thể kiểm tra ['configureBlocking'] (http://docs.oracle.com/javase/7/docs/api/java/nio/channels/spi/AbstractSelectableChannel.html#configureBlocking (boolean)) và [' available' ] (http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html # available()) –

0

Tại một số điểm, ổ cắm sẽ bị đóng và không thể gửi thêm dữ liệu qua luồng đó. Đây là khi InputStream sẽ báo hiệu EOF bằng cách trả về -1 từ read() và quá tải của nó. Trạng thái này không thể đảo ngược. Con suối đó đã chết.

Việc chặn nhiều dữ liệu hơn trên luồng mở không phải là điều kiện EOF.

+0

Sự khác biệt chính xác giữa EOF và EOS (tream) là gì? - Câu trả lời như "mã ký tự" cũng hợp lệ – salbeira

+0

@salbeira Không có sự khác biệt và không có dữ liệu nào thực sự được truyền qua luồng (hoặc đọc từ tệp). Kết quả này được tạo ra bởi lớp thực thi 'InputStream'. Đó là kết quả của logic, nó không phải là tín hiệu trong băng tần. – erickson

1

Tôi chưa bao giờ thực sự có một null, như hầu hết các dòng (trong trường hợp của một dòng suối mạng mà tôi sử dụng thường xuyên nhất) chỉ chặn việc thực hiện chương trình cho đến khi một cái gì đó được viết vào trong dòng vào cuối từ xa

Không. Bạn không bao giờ có giá trị rỗng vì ngang hàng không bao giờ đóng kết nối. Đó là những gì 'cuối dòng' có nghĩa là. Nó không có nghĩa là 'không có nhiều dữ liệu hơn cho thời gian này'.

Các vấn đề liên quan