Java 关于System.in和stream的问题

Java 关于System.in和stream的问题,java,java.util.scanner,Java,Java.util.scanner,有没有办法重置System.in,这样我就可以有一个新的流,让扫描仪等待输入?这是我的密码: boolean run = true; String commandLine = ""; Scanner keyboard; Tokenizer arguments; RecursiveDescentParser parse; while (run){ // Command prompt System.out.print

有没有办法重置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,提示一个问题:如何解决此问题?我可以重新设置流吗?谢谢您的帮助。

我想您正在寻找:

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

但是,最好不要在中替换
系统,只需将其余代码作为输入流使用。

我想您正在寻找:

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

但是,最好不要替换
系统。
,而只是让其余的代码使用一个输入流。

请您详细解释一下,让其余的代码使用一个输入流是什么意思。@user633658:那么,System.in有什么特别之处?如果你真的需要重置它,这表明你正在其他地方使用它。该代码是否必须知道它正在使用System.in?您不能将System.in作为参数传递给构造函数或其他什么吗?问题是,代码是我只能从控制台读入数据或使用扫描仪重定向一次,因为System.in problems hasNextLine()无限期返回false。@user633658:但不清楚为什么需要重定向它以从文件读取。为什么不直接更改试图使用System.in的代码以直接使用该文件?您试图通过使用该文件实现什么?(您是否尝试过我建议的更改?)该代码通过收集控制台输入或用户可以重定向文件中的输入来工作。这不会是一个问题,但流的限制意味着控制台输入是一次性的,因此任何进一步的用户控制台输入都会因为流而失败。代码需要一致的用户输入,因为这是前端输入到主程序的控制台输入,但只能执行一次很糟糕。请您详细解释一下,让我的其余代码使用输入流是什么意思。@user633658:那么,System.in有什么特别之处?如果你真的需要重置它,这表明你正在其他地方使用它。该代码是否必须知道它正在使用System.in?您不能将System.in作为参数传递给构造函数或其他什么吗?问题是,代码是我只能从控制台读入数据或使用扫描仪重定向一次,因为System.in problems hasNextLine()无限期返回false。@user633658:但不清楚为什么需要重定向它以从文件读取。为什么不直接更改试图使用System.in的代码以直接使用该文件?您试图通过使用该文件实现什么?(您是否尝试过我建议的更改?)该代码通过收集控制台输入或用户可以重定向文件中的输入来工作。这不会是一个问题,但流的限制意味着控制台输入是一次性的,因此任何进一步的用户控制台输入都会因为流而失败。代码需要一致的用户输入,因为这是前端输入控制台输入到主程序中,但只能执行一次很糟糕。