2010-06-05 64 views
3

讀取輸入的替代方法我正在研究UVa Online Judge問題集歸檔文件作爲練習Java的一種方式,以及作爲練習數據結構和算法的一般方法。從Java的System.in

他們給了一個示例輸入文件提交給在線裁判使用作爲一個起點(這是問題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或java.util.regex包的拆分方法?

+3

我看着代碼並哭泣 – Yacoby 2010-06-05 23:49:11

+1

您使用MS Word作爲IDE? *指向那些不會編譯的捲曲引號。* – BalusC 2010-06-06 00:13:06

+0

Ha。是的,我通常在發佈之前用Word寫東西來拼寫檢查等,只是習慣。好點,但我會記得下一次。愚蠢的捲曲報價。 – dvanaria 2010-06-06 00:27:16

回答

7

你絕對不需要一次讀取一個字節(你也不用C語言,這就是fgets)。根據你在做什麼,你可能會使用​​或Scanner

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

Scanner sc = new Scanner(System.in); 

的BufferedReader有readLine方法,而掃描儀有多種有用的方法,包括nextLinenextIntnextDouble等,這些處理轉換爲您。它還具有讀取任意令牌的基於正則表達式的分隔符。

瞭解Java的一件事是,它對二進制數據(Streams)和字符數據(讀者和作者)有着非常明確的區別。有默認的解碼器和編碼器(如上所用),但您始終可以靈活地選擇編碼。

+0

這些唯一的缺點是它們被緩衝,並且如果每次在readline方法中重新創建它們,如果在同一時間輸入多行(如果使用java測試程序時發生錯誤-jar ... Ferrybig 2016-12-01 15:18:06