2011-11-20 12 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); 

Zauważyłem, że jeśli zamknę BufferedReader, nie będzie mógł wstawić wejście z klawiatury już jako System.in jest w jakiś sposób zamknięty. Czy mimo to mogę zachować br.close() (potrzebuję tego, aby usunąć plik), a następnie dodać więcej danych z klawiatury?Zamknięcie BufferedReader i System.in

+2

usunąć jaki plik? BufferedReaders mają być powiązane z konkretnym strumieniem wejściowym. Po ich zamknięciu nie można ich ponownie użyć. – soulcheck

+6

Ty * naprawdę * nie musisz zamykać 'br' w celu usunięcia pliku. –

+1

Jeśli czytasz z pliku i używasz 'BufferedReader' do pewnego momentu, a następnie zamknij' BufferedReader', a następnie czytaj więcej ze strumienia plików, stracisz trochę bajtów. Te bajty są pobierane przez buforowany czytnik (w celu buforowania). Musisz znaleźć inny sposób. Dlaczego musisz przejść z podklasy Reader do skanera? Niektóre ograniczenia API? W obu przypadkach można robić różne rzeczy, na przykład za pomocą 'RandomAccessFile' i/lub niestandardowej podklasy Scanner, która może robić również rzeczy Reader. –

Odpowiedz

2

Wygląda jak trzeba:

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

owijane wokół System.in że przed dokonaniem czytelnika, a potem wszystko będzie dobrze, ponieważ nie będzie to zrobić, gdy używasz FileInputStream.

+0

jak dokładnie to zrobić? –

+0

Mówisz "nowy CloseShieldInputStream (System.in)" – bmargulies

+0

dziękuję. Skończyło się na tym, że nie usunąłem tego pliku, po prostu napisałem go ponownie z poprawnymi informacjami :) –

0

Jeśli chcesz tylko uzyskać dane wejściowe z klawiatury przez System.in, użyj statycznego buforowania WrapedReader InputStreamReader (również owijając System.in). Podobnie jak:

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

I is.close(); będą potrzebne tuż przed zakończeniem Twojego wniosku.