从Java读取输入的替代方法';s系统

从Java读取输入的替代方法';s系统,java,input,standards,system.in,Java,Input,Standards,System.in,我正在研究UVa在线判断习题集归档,作为练习Java的一种方式,也作为练习一般数据结构和算法的一种方式 他们给出了一个示例输入文件,提交给在线法官作为起点(这是问题100的解决方案) 标准输入流(java.lang.System.in)的输入是这个站点上任何解决方案的一部分,但我无法理解从System.in读取的实现,他们在示例解决方案中给出了这个实现。的确,输入文件可以由整数、字符串等的任何变化组成,但每个解决方案程序都需要从System.in读取基本的文本输入行,每次一行。必须有一种更好(更

我正在研究UVa在线判断习题集归档,作为练习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));
}   
公共静态字符串readLn(int-maxLg){
字节lin[]=新字节[maxLg];
int lg=0,car=-1;
字符串行=”;
试一试{
while(lg

我真的很惊讶。它看起来像是直接从K&R的“C编程语言”(不管怎样,这是一本好书)中提取出来的东西,不包括访问级别修改器和异常处理等。尽管我理解它的实现,但它似乎是由C程序员编写的,绕过了Java的大多数面向对象特性。有没有更好的方法来做到这一点,使用StringTokenizer类,或者使用String的拆分方法或java.util.regex包?

您肯定不需要一次读取一个字节(您也不需要使用C,这就是它的用途)。根据您正在做的工作,您可以使用或:

BufferedReader有一个方法,而Scanner有多种有用的方法,包括、、等,它们为您处理转换。它还有一个基于正则表达式的分隔符,用于读取任意标记


关于Java需要了解的一点是,它在二进制数据(流)和字符数据(读写器)之间有着非常明确的区别。有默认的解码器和编码器(如上所述),但您始终可以灵活地选择编码。

我查看了代码,然后问您是否使用MS Word作为IDE?指向那些无法编译的卷引号。Ha。是的,我通常在发帖前用Word写一些东西来检查拼写等,只是习惯而已。说得好,下次我会记得的。愚蠢的卷曲引号。你真正的IDE不做拼写检查吗?多么原始!它们唯一的缺点是它们是缓冲的,如果您每次都在readline方法中重新创建它们,那么如果同时输入多行代码(在使用
java-jar…
测试程序时发生),您就有丢失输入的风险,所以将它们制作一次并重用它们
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

Scanner sc = new Scanner(System.in);