[英]How do I read both from keyboard and from file?
我有一個可以從鍵盤或文件(通過管道)讀取的掃描儀,顯然無法分辨是哪個。
我有以下代碼:
Scanner scan = new Scanner(System.in);
while (scan.hasNextLine()) {
String line = scan.nextLine();
doStuff();
}
將輸入重定向到文件時效果很好。 但是如果我嘗試自己運行程序並從鍵盤讀取,它就會進入無限循環。 有沒有辦法區分從鍵盤讀取和從文件讀取? 提前致謝!
編輯 1:根據@Abra 的要求,這是我的代碼在您的建議下的樣子:
Scanner scan = new Scanner(System.in);
do {
String linea = scan.nextLine();
doStuff();
} while (System.in.available() != 0 && scan.hasNextLine());
這是我正在運行的命令:
java -jar Class.jar < File.txt
編輯 2:解決了,原來我應該只評估 System.in.available():= 0 一次:
Scanner scan = new Scanner(System.in);
boolean file = System.in.available() != 0;
do {
String linea = scan.nextLine();
doStuff();
} while (file && scan.hasNextLine());
Linux 和 Unix 中常用的經典做法是從標准輸入中讀取輸入,就像你已經在做的那樣。 在 Java 中,標准輸入稱為System.in
。
該程序從標准輸入中讀取並循環處理它讀取的內容,直到它檢測到文件結尾,您已經在這樣做了。
所以你的程序沒有卡住——它只是在等待更多的輸入或來自外部的文件結束信號。
如果你想使用來自文件的輸入這個程序,你可以像這樣運行它:
myprogram < input_file.txt
如果你想讓你的程序從終端(你輸入它的地方)獲取它的輸入,你運行它就像
myprogram
在這種情況下,在鍵入您的輸入后,您還負責從您的終端發送一個特殊信號,該信號將充當“文件結束”並由程序選擇,導致while
循環退出。 通常,您可以通過按 Control-D 來執行此操作。
請記住,從標准輸入讀取與從鍵盤讀取並不嚴格相同。 標准輸入只知道文本和文件結尾; 它沒有行編輯的概念,也沒有測試何時按下/釋放 shift 鍵等。
根據@Abra 的回答,如果 System.in 是鍵盤,您可以打破循環:
import java.util.Scanner;
import java.io.IOException;
public class Main {
public static void main(String[] argv) throws IOException {
Scanner scan = new Scanner(System.in);
boolean isKeyboard = System.in.available() == 0;
while (scan.hasNextLine()) {
String line = scan.nextLine();
doStuff();
if (isKeyboard) {
break;
}
}
}
}
System.in
的 class 是java.io.InputStream
。 那個 class 有方法available()
。 如果您將System.in
重定向到一個文件,如
myprogram < input_file.txt
然后方法available()
返回一個大於零的數字(假設input_file.txt
具有非零大小)但是當System.in
引用標准輸入 stream 時,即當您運行程序而不重定向標准輸入時,如
myprogram
然后方法available()
返回零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.