繁体   English   中英

如何使用java应用程序“重置”或“清除”System.in?

[英]How to “reset” or “clear” System.in using java application?

我正在运行一个类似于下面的Java应用程序:

InputStreamReader isReader = new InputStreamReader(System.in);
BufferedReader bufReader = new BufferedReader(isReader);
while (true) {
    try {
        String inputStr = null;
        if ((inputStr=bufReader.readLine()) != null) {
            //DO SOMETHING
        }
        else {
            System.out.println("input is null");
        }
    }
    catch (Exception e) {
        //DO SOMETHING
    }
}

使用此命令java test < textfilename但是在读完所有内容后,应用程序开始保持打印input is null 当然我可以添加break; System.out.println("input is null");下面System.out.println("input is null"); ,但是有没有办法可以清除输入缓冲区并开始从命令行获取输入?

PS:我正在使用的文件示例:

11111111
11111112
11111113
11111114

据我所知,这是不可能的。 当您在命令行中使用<从文件读取时, System.in的内容由shell控制,而不是由Java控制。

readLine()返回null是Java表示您已到达文件末尾的方式,也是您在shell中发送EOF /类型Ctrl-D时获得的方式。

您无法重定向输入或输出,并且可以访问常规控制台System.in 文档 (强调我的):

虚拟机是否具有控制台取决于底层平台以及虚拟机的调用方式。 如果从交互式命令行启动虚拟机而不重定向标准输入和输出流,则其控制台将存在,并且通常将连接到启动虚拟机的键盘和显示器。

也就是说,只需对代码进行最少的更改,您仍可以在很大程度上完成所需的任务。

public static void main(String args[]) throws FileNotFoundException {
    readFile(args[0]);
    // Continue normal console input here
}

private static void readFile(String filename) throws FileNotFoundException {
    InputStream original = System.in;
    System.setIn(new FileInputStream(filename)); // VM trickery

    try (BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in))) { 
        String inputStr = null;
        while ((inputStr = bufReader.readLine()) != null) { // stops loop on `null`
            System.out.println(inputStr);
        }
    } catch (IOException e) { 
        e.printStackTrace();
    }

    System.setIn(original); // more VM trickery
}

主要变化:

  • 使用输入文件的文件名作为第一个参数调用,即java test textfilename
  • 使用FileInputStream
  • 使用try-with-resources确保我添加的FileInputStream已关闭
  • 处理readLine()的null返回值,不在null上无限循环

也许是这样的:

InputStreamReader isReader = new InputStreamReader(System.in);
BufferedReader bufReader = new BufferedReader(isReader);
String inputStr = null;
try {
   while ((inputStr=bufReader.readLine()) != null) {
   //DO SOMETHING
   }
}catch (Exception e) {
//DO SOMETHING
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM