繁体   English   中英

java.util.Scanner:仅空格输入的行为?

[英]java.util.Scanner: Behavior with whitespace-only input?

我尝试为Java课程编写一个小型解析器:解析器使用Scanner类:

import java.util.Scanner;
import java.io.*;

public class WC1 {

    public static void main(String[] args) throws Exception{

        File f = new File(args[0]);
        Scanner in = new Scanner(f);

        int c=0, w=0, l=0;

        while (in.hasNext()) {
            String line = in.nextLine();
            int N = line.length();

            boolean word = false;

            for (int i=0;i<N;i++) {
                char ch = line.charAt(i);
                if (ch == '\r' || ch=='\n') {
                    if (word == true) w++;
                    word = false; // do nothing
                }
                else if (ch == ' ' || ch == '\t') {
                    if (word == true) w++;
                    word = false;
                    c++;
                }
                else {
                    word = true;
                    c++;
                }
            }

            if (word == true) w++;
            word = false; // scanner consumes newline but does not return it
            c++; // scanner throws away the newline
            l++;
            System.out.println(line);
        }

        in.close();
        System.out.println("" + c + " characters");
        System.out.println("" + w + " words");
        System.out.println("" + l + " lines");
    }

}

文件1:

我使用以下三个小输入文件对其进行了测试:

出现异常的原因是,您一次使用扫描仪后将调用keyIn.close(),这不仅会关闭扫描仪,还会关闭System.in。 在下一个迭代中,您将创建一个新的Scanner,由于System.in现在已关闭,该扫描器立即崩溃。 要解决此问题,您应该做的只是在进入while循环之前创建一个扫描程序一次,并且由于不想关闭System.in而完全跳过close()调用。

修复该程序后,由于==和!=字符串比较,该程序仍然无法运行。 在Java中比较字符串时,必须使用equals()比较字符串内容。 当使用==和!=时,您正在比较对象引用,因此这些比较将始终在代码中返回false。 始终使用equals()比较字符串。

java MyClass File1.dat

779 characters
136 words
3 lines

wc File1.dat

3     136     779 test.dat

文件2:

cat
dog
goose chicken
 rat
dragon

crab

java MyClass File2.dat

47 characters
7 words
7 lines

wc File2.dat

7     7     47 File2.dat

但这不起作用:

文件3:

       |
      |
     |
    |
   |
  |
 |
|

java MyClass File3.dat

0 characters
0 words
0 lines

wc File3.dat

8     0     36 File3.dat

文件3仅由空格和换行符组成:管道符号表示行尾。

这是怎么回事 请注意File2中的空行。 为什么扫描程序似乎忽略了File3中的空格?

扫描程序使用定界符模式将其输入分为令牌,默认情况下,该模式与空格匹配。 然后,可以使用各种下一种方法将生成的令牌转换为不同类型的值。

http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

while (in.hasNext()) {
    String line = in.nextLine();

在这里,我们检查的扫描仪hasNext但推进nextLine 这些基本上是无关的。 您发现的结果是您的第3个文件没有令牌(非空格由空格分隔),但有行。 在这种情况下,应始终使用实际使用的hasXXX方法检查hasXXX

while (in.hasNextLine()) {
    String line = in.nextLine();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM