簡體   English   中英

從Java的System.in讀取輸入的替代方法

[英]An alternative to reading input from Java's System.in

我正在研究UVa Online Judge問題集存檔作為練習Java的方法,並且作為一種練習數據結構和算法的方法。

他們提供了一個示例輸入文件,提交給在線評判者作為起點(這是問題100的解決方案)。

標准輸入流(java.lang.System.in)的輸入是此站點上任何解決方案的一部分,但我無法理解他們在示例解決方案中提供的System.in讀取的實現。 確實,輸入文件可以包含整數,字符串等的任何變化,但每個解決方案程序都需要從System.in讀取基本的文本輸入行,一次一行。 必須有一個更好的(更簡單和更健壯的)從Java標准輸入流收集數據的方法,而不是:

public static String readLn(int maxLg) {
    byte lin[] = new byte[maxLg];
    int lg = 0, car = -1;
    String line = “”;
    try {
        while (lg < maxLg) {
            car = System.in.read();
            if ((car < 0) || (car == ‘\n’)) {
                break;
            }
            lin[lg++] += car;
        }
    } catch (java.io.IOException e) {
        return (null);
    }
    if  ((car < 0) && (lg == 0)) {
        return (null); // eof
    }
    return (new String(lin, 0, lg));
}   

我對此感到很驚訝。 它看起來像直接從K&R的“C編程語言”(無論如何都是一本好書)中提取,減去訪問級別修改和異常處理等。即使我理解了實現,它看起來好像是由C程序員編寫的,繞過Java的大多數面向對象的本質。 有沒有更好的方法來實現這一點,使用StringTokenizer類,或者使用String的split方法或java.util.regex包?

你絕對不必一次讀取一個字節(你也不用C語言,這就是fgets的用途)。 根據您正在做的事情,您可以使用BufferedReaderScanner

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

Scanner sc = new Scanner(System.in);

BufferedReader有一個readLine方法,而Scanner有各種有用的方法,包括nextLinenextIntnextDouble等,它們可以為你處理轉換。 它還有一個基於正則表達式的分隔符,用於讀取任意標記。

有一點需要理解的是,它在二進制數據(Streams)和字符數據(Readers and Writers)之間有着非常清晰的區別。 有默認的解碼器和編碼器(如上所述),但您始終可以靈活地選擇編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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