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