簡體   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