簡體   English   中英

如何從鍵盤和文件中讀取?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM