2016-06-10 12 views
6

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?

+0

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

+2

Chỉ khi đầu vào thực sự kết thúc, ví dụ:'echo abc | java SystemInTest' – zapl

+0

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

Trả lời

1

Luồng đầu vào không có kích thước cố định để chương trình của bạn tham gia vòng lặp vô hạn và yêu cầu nhập lại nhiều lần. Tuy nhiên, tệp h.txt có kích thước cố định nên khi bị chấm dứt.

4

Nhấn Enter chỉ có nghĩa là bạn đã hoàn thành một dòng, điều đó không có nghĩa là bạn đã hoàn thành toàn bộ "tệp".

Cách bạn hoàn thành tệp phụ thuộc vào hệ điều hành. Trên Linux, nó là Ctrl+D, bạn có thể sử dụng trong nhiều chương trình để thoát chúng (thay vì gõ exit hoặc quit). Trên Windows, nó là Ctrl+Z.

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