2011-11-20 31 views
5
Reader rdr = new InputStreamReader(System.in); 
BufferedReader br = new BufferedReader(rdr); 
String s; 
s = br.readLine(); 
br.close(); 
Scanner sc = new Scanner(System.in); 
s = sc.nextLine(); 
System.out.print(s); 

tôi đã nhận thấy rằng nếu tôi đóng BufferedReader, tôi sẽ không thể để chèn vào từ bàn phím nữa, như System.in được bằng cách nào đó đóng cửa. Có anyway tôi có thể giữ br.close() (tôi cần rằng để xóa một tập tin) và sau đó thêm nhiều đầu vào từ bàn phím?Đóng BufferedReader và System.in

+2

xóa tệp nào? BufferedReaders có nghĩa là bị ràng buộc với luồng đầu vào cụ thể. Khi bạn đóng chúng, bạn không thể sử dụng lại chúng. – soulcheck

+6

Bạn * thực sự * không cần phải đóng 'br' để xóa tệp. –

+1

Nếu bạn đang đọc từ một tệp và sử dụng 'BufferedReader' tối đa một số điểm và sau đó đóng' BufferedReader' và sau đó đọc thêm từ luồng tệp, bạn sẽ bỏ lỡ một số byte. Các byte này được tiêu thụ bởi bộ đọc đệm (để đệm). Bạn sẽ cần phải tìm một cách khác. Tại sao bạn cần chuyển từ lớp con Reader sang Máy quét? Một số hạn chế api? Trong cả hai trường hợp, bạn có thể thực hiện các công việc khác nhau, ví dụ bằng cách sử dụng lớp con 'RandomAccessFile' và/hoặc một lớp con Máy quét tùy chỉnh có thể thực hiện các thao tác của Reader. –

Trả lời

2

Hình như bạn cần:

http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html

Bọc rằng khoảng System.in trước khi thực hiện đọc của bạn, và sau đó tất cả sẽ tốt, vì bạn sẽ không làm điều đó khi bạn đang sử dụng một FileInputStream.

+0

Tôi chính xác làm như thế nào? –

+0

Bạn nói 'mới CloseShieldInputStream (System.in)' – bmargulies

+0

cảm ơn bạn. Tôi đã kết thúc bằng cách sử dụng một cách xung quanh này, tôi đã không xóa tập tin đó, tôi chỉ viết lại nó với các thông tin chính xác :) –

0

Nếu bạn chỉ muốn nhận dữ liệu đầu vào từ bàn phím của System.in, vui lòng sử dụng bộ đệm InputStreamReader gói đệm BufferedReader (cũng gói System.in). Như sau:

Public BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); 

Và is.close(); sẽ cần thiết ngay trước khi đơn đăng ký của bạn chấm dứt.

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