Tôi đã có một chương trình Writer viết một dòng văn bản vào một tệp, sau đó chờ cho đến khi người dùng truy cập trở lại trước khi nó viết một dòng khác và sau đó thoát ra. Chỉ sau đó là tập tin đã đóng. Mã này:Tại sao FileInputStream read() không chặn?
public class Writer {
Writer() {
}
public static String[] strings =
{
"Hello World",
"Goodbye World"
};
public static void main(String[] args)
throws java.io.IOException {
java.io.FileOutputStream pw =
new java.io.FileOutputStream("myfile.txt");
for(String s : strings) {
pw.write(s.getBytes());
System.in.read();
}
pw.close();
}
}
Bắt đầu đầu tiên với:
java Writer
Sau đó, tôi cũng có một chương trình đọc mà nên (tốt tôi mong đợi) chặn miễn là văn bản về tệp chưa hoàn thành (tức là pw.close() chưa được gọi). Mã này:
public class ReaderFIS extends Object {
ReaderFIS() {
}
public static void main(String[] args) throws Exception {
java.io.FileInputStream in = new java.io.FileInputStream("myfile.txt");
int ch = -1;
while((ch = in.read()) >= 0) {
System.out.println("ch = " + ch);
}
System.out.println("Last ch = " + ch);
System.out.println("exiting");
}
}
Bắt đầu với:
ReaderFIS java
Bây giờ tôi mong đợi các read() để chặn sau khi đọc đầu tiên "Hello World" văn bản, trên cơ sở này trong tài liệu Javadoc:
Đọc một byte dữ liệu từ luồng đầu vào này. Phương thức này sẽ chặn nếu không có đầu vào nào. Thông qua: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()
Nhưng ReaderFIS được thực hiện ngay sau khi đọc "Hello World" và dường như thấy EOF! Vì vậy, nó không phải khối! Nó đổ các giá trị ký tự, sau đó là -1 và sau đó in "thoát".
Output: ch = 72 ch = 101 ch = 108 ch = 108 ch = 111 ch = 32 ch = 87 ch = 111 ch = 114 ch = 108 ch = 100 Cuối cùng ch = -1 thoát
Các biến thể khác mà tôi đã thử là: đọc qua getChannel(), kiểm tra qua getChannel() nếu nó có thể được khóa() ed, using available(), try read() bằng cách sử dụng đệm, cố gắng readLine(), liên tục viết một char acter trong tập tin với một tạm dừng 500msec ở giữa mỗi viết, không viết bất cứ điều gì chỉ cần giữ các tập tin mở trong Writer.
Không có biến thể nào trong số này làm cho chương trình ReaderFIS chặn, nó luôn luôn kết thúc.
Tại sao chương trình người đọc không chặn? Tôi đã bỏ lỡ một cái gì đó soooo rất rõ ràng? Có vẻ như chương trình ReaderFIS tìm thấy một EOF (-1) nhưng tại sao? Tệp chưa được đóng bởi chương trình Writer.
Phụ trang "vui nhộn": System.in.read() đang chặn! (và chờ người dùng nhấn Enter).
PS: đã dùng thử trên Windows XP và Suse Linux. Trên Windows, tôi không thể xóa tệp trong khi người viết đang chạy (như tôi mong đợi).
Trân trọng, Marco
khi bạn ghi vào đĩa bạn buộc EOF, không? EOF chỉ được di chuyển khi bạn thêm thông tin mới. Nhưng khối trên đĩa phải có một EOF ... – jcolebrand
Vì vậy, bạn đang nói EOF là * luôn luôn * bằng văn bản bởi vì một tập tin luôn luôn cần một. Nhưng tôi nghĩ rằng một EOF chỉ được viết vào cuối sau khi xả và đóng tập tin. Nhưng điều đó có nghĩa là read() của tôi sẽ không bao giờ chặn khi đọc một tệp vì luôn có * một EOF và luôn trả về -1 ngay cả khi tệp rỗng. Vì vậy, JavaDoc không chính xác? – QQQuestions