2009-09-16 4 views
9

Oto prosty kawałek kodu:Command Line rur Wejście w Javie

import java.io.*; 
public class Read { 
public static void main(String[] args) { 
    BufferedReader f = new BufferedReader(new InputStreamReader(System.in)); 
    while(true) 
    { 
    String x = null; 
    try{ 
    x = f.readLine(); 
    } 
    catch (IOException e) {e.printStackTrace();} 
    System.out.println(x); 
    } 
} 
} 

mogę wykonać to jako: Java Czytaj < input.txt

Po input.txt jest całkowicie wyprowadzony do programu x ciągle dostaje nieskończone wartości null. Dlaczego to jest takie? Czy istnieje sposób, w jaki mogę aktywować wejście standardowe (wiersz poleceń) po zakończeniu podawania pliku do kodu? Próbowałem zamknąć strumień i ponownie go otworzyć, to nie działa. Zresetuj itp. Również.

+0

Czy oryginalny kod został zmodyfikowany, aby uwzględnić zaakceptowaną odpowiedź. Ponieważ ta odpowiedź nie wydaje się dotyczyć teraz tego kodu: kod nie odczytuje pliku z listy argumentów lub czegoś takiego, jak sugeruje odpowiedź. Byłoby lepiej, gdyby w tym przypadku zostawiono błędny kod, aby cała ta strona miała więcej sensu. – Rondo

+0

@Rondo - nie. [Tutaj] (http://stackoverflow.com/posts/1431551/revisions) są wersjami. –

Odpowiedz

16

Przy wykonywaniu "java Read < input.txt" mówiłeś, że system operacyjny dla tego procesu, plik nastrojową jest standard. Nie można następnie powrócić do wiersza poleceń od wewnątrz aplikacji.

Jeśli chcesz to zrobić, przekaż input.txt jako parametr nazwy pliku do aplikacji, otwórz/przeczytaj/zamknij plik z poziomu aplikacji, następnie odczytaj ze standardowego wejścia, aby pobrać elementy z wiersza poleceń .

+0

Dzięki za odpowiedź, wyjaśnia –

9

Cóż, jest to typowe dla czytania w BufferedReader. readLine() zwraca null po trafieniu końca strumienia. Być może twój nieskończonej pętli jest problem ;-)

// try/catch ommitted 

String x = null; 

while((x = f.readLine()) != null) 
{ 
    System.out.println(x); 
} 
6

Trzeba zakończyć pętli while, gdy linia jest null, jak to:

BufferedReader in = null; 
    try { 
     in = new BufferedReader(new InputStreamReader(System.in)); 
     String line; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 
    } 
    catch (IOException e) { 
     logger.error("IOException reading System.in", e); 
     throw e; 
    } 
    finally { 
     if (in != null) { 
      in.close(); 
     } 
    } 
0

Czy istnieje sposób, za pomocą którego mogę uaktywnić wejście standardowe (linia poleceń) po zakończeniu podawania pliku do kodu?

Niestety podbić starą pytanie, ale żadna z odpowiedzi jak dotąd wskazuje, że istnieje jest a (shell-only) sposób przejść z powrotem do konsoli wejście po rurociągów w pliku.

Jeśli uruchomić polecenie

{ cat input.txt & cat; } | java Read 

następnie tekst z input.txt zostanie przekazany do java Read i zostanie upuszczony z powrotem do konsoli wejście.

Zauważ, że jeśli następnie naciśnij Ctrl + D, dostaniesz nieskończoną pętlę null s, chyba zmodyfikować swój program, aby zakończyć pętlę, gdy odbiera wartość null.