[英]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的用途)。 根據您正在做的事情,您可以使用BufferedReader或Scanner :
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Scanner sc = new Scanner(System.in);
BufferedReader有一個readLine
方法,而Scanner有各種有用的方法,包括nextLine
, nextInt
, nextDouble
等,它們可以為你處理轉換。 它還有一個基於正則表達式的分隔符,用於讀取任意標記。
有一點需要理解的是,它在二進制數據(Streams)和字符數據(Readers and Writers)之間有着非常清晰的區別。 有默認的解碼器和編碼器(如上所述),但您始終可以靈活地選擇編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.