我正在练习Java编程,以及数据结构和算法,所以选择了UVa Online Judge问题集档案作为练习的方式。
他们提供了一个示例输入文件,可用作起点(它是问题100的解决方案)。
在这个网站上,任何解决方案都需要从标准输入流(java.lang.System.in)中获取输入,但我无法理解他们在示例解决方案中给出的从System.in读取的实现方法。虽然输入文件可能包含任何类型的整数、字符串等,但每个解决方案程序都需要逐行从System.in读取基本文本输入。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包中的方法?