2011-02-25 173 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