[英]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
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.