2010-06-05 32 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