Tôi biết rằng System.in của lớp System là một cá thể của một lớp con cụ thể của InputStream vì phương thức read() của InputStream là trừu tượng và System.in phải ghi đè phương thức này. Theo tài liệu về phương pháp read() của InputStream:nhầm lẫn về hành vi của phương thức read() của System.in trong Java
public abstract int read() throws IOException
Đọc các byte tiếp theo của dữ liệu từ dòng nhập dữ liệu. Giá trị byte được trả về dưới dạng int trong phạm vi từ 0 đến 255. Nếu không có byte nào có sẵn vì đã kết thúc luồng, giá trị -1 được trả về. Phương pháp này chặn cho đến khi dữ liệu đầu vào khả dụng, cuối luồng được phát hiện hoặc ngoại lệ được ném.
Một lớp con phải cung cấp việc triển khai phương pháp này.Trả về:
byte tiếp theo của dữ liệu hoặc -1 nếu kết thúc luồng.Số lần ném:
IOException - nếu xảy ra lỗi I/O.
Phương thức read() phải trả về -1 nếu kết thúc luồng. Câu hỏi của tôi là, khi nào System.in.read() trả về -1?
Sau đây là mẫu mã:
import java.io.*;
class SystemInTest{
public static void main(String[] args) throws IOException{
InputStream in = System.in;
//InputStream in = new FileInputStream("h.txt");
int ch = 0;
while((ch = in.read()) != -1){
System.out.println(ch);
}
}
}
Run mã này, và gõ "abc" tiếp theo là một "Enter", kết quả là (dưới Linux):
97
98
99
10
Sau đó, ứng dụng bị chặn và chờ một đầu vào khác. Nhưng tôi nghĩ câu lệnh trong vòng lặp while "ch = in.read()" sẽ tiếp tục chạy và trả về -1 sau khi đọc ký tự chấm dứt dòng và in 10 trên bàn điều khiển. Nếu vậy, ứng dụng sẽ bị chấm dứt. Nhưng nó bị chặn.
Để so sánh, nếu tôi bỏ ghi chú dòng nhận xét, sử dụng tệp có nội dung "abc \ n" làm luồng đầu vào byte, thì ứng dụng sẽ kết thúc như mong đợi vì -1 được trả lại.
Có đúng là System.in.read() không bao giờ trả về -1 không? Nếu vậy, tại sao việc thực hiện phương thức read() trong System.in khác với các lớp con khác của InputStream như FileInputStream?
Nhấn ctrl-D (có thể hai lần) để đóng luồng đầu vào. Nếu bạn không thực sự đóng luồng, bạn không ở EOF. –
Chỉ khi đầu vào thực sự kết thúc, ví dụ:'echo abc | java SystemInTest' – zapl
Những gì bạn đề nghị sẽ ngăn chặn bất kỳ chương trình nào đọc nhiều hơn một dòng từ dòng lệnh. Luồng không bị đóng. Nó chỉ chờ bạn nhập các ký tự tiếp theo. -1 sẽ được trả lại nếu bạn sử dụng 'java MyClass