2011-02-25 176 views
0

有沒有辦法重置System.in,這樣我就可以有一個新的流,讓Scanner等待輸入?這裏是我的代碼:關於System.in和流的問題

boolean run = true; 
    String commandLine = ""; 
    Scanner keyboard; 

    Tokenizer arguments; 
    RecursiveDescentParser parse; 

    while (run){ 
     // Command prompt 
     System.out.print(" ==>\t"); 

     keyboard = new Scanner(System.in); 

     while (keyboard.hasNextLine()) { 
       commandLine += " " + keyboard.nextLine(); 
     } 

     keyboard.close(); 

     keyboard = null; 

     System.setIn (new FileInputStream (FileDescriptor.in) ) ; 

     System.setIn(System.in); 

     keyboard = new Scanner(System.in); 

     arguments = new Tokenizer(commandLine); 
     commandLine = ""; 
     parse = new RecursiveDescentParser(arguments, false); 
     run = parse.parseStartSymbol(); 
    }   
} 

一旦這個計劃已經運行一次,hasNextLine()將返回false無限期提示一個問題我該如何解決這個問題?我可以重新設置流嗎?感謝您的幫助。

回答

3

我認爲你正在尋找:

InputStream originalInput = System.in; 
System.setIn(new FileInputStream(FileDescriptor.in)); 
// Do stuff 
System.setIn(originalInput); 

然而,這將是一個更好的主意從未更換System.in,只是讓你的代碼的其餘部分採取的輸入流與合作。

+0

你可以詳細說明一下你的意思,讓我的代碼的其餘部分採取輸入流的工作。 – user633658 2011-02-25 06:42:24

+0

@ user633658:那麼,System.in有什麼特別之處?如果你真的需要重置它,這表明你在其他地方使用它。該代碼是否必須*知道*它正在使用System.in?你不能將System.in作爲參數傳遞給構造函數嗎? – 2011-02-25 07:00:04

+0

問題是因爲代碼是我只能從控制檯讀取數據或使用掃描器重定向一次,因爲system.in問題hasNextLine()無限期地返回false。 – user633658 2011-02-25 07:04:23