【问题标题】:how to extract data from text file in JavaJava如何从文本文件中提取数据
【发布时间】:2014-05-02 20:07:06
【问题描述】:

而(myFile.hasNextLine()){ if(myFile.next().equals("Oval")) { System.out.println("this is an Oval"); } else if(myFile.next().equals("Rectangle")) { System.out.println("this is an Rectangle"); }

该文件包含以下内容
椭圆形 10 10 80 90 红色
椭圆形 20 20 50 60 蓝色
矩形 10 10 100 100 绿色

我想提取数据并根据行首指示的类型将它们传递给特定的构造函数。

但我得到了这个奇怪的输出

这是一个椭圆形 线程“主”java.util.NoSuchElementException 中的异常 这是一个矩形 在 java.util.Scanner.throwFor(Scanner.java:907) 这是一个矩形 在 java.util.Scanner.next(Scanner.java:1416) 在 TestMain.main(TestMain.java:33) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:601) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

进程以退出代码 1 结束

【问题讨论】:

    标签: java file file-io


    【解决方案1】:

    了解当您在 Scanner 对象上调用 next() 时,它会吃掉下一个令牌,然后将其返回给您。如果您不将返回的 String 分配给变量,它将永远丢失,并且下次您调用 next() 时,您将获得一个新令牌。更好地获取令牌,将其分配给 String 变量,然后进行 if 测试。不要在 if 布尔测试块中调用 next()

    例如:

    while (myFile.hasNextLine()) {
    
        // get the token **once** and assign it to a local variable
        String text = myFile.nextLine();
    
        // now use the local variable to your heart's content    
        if(text.equals("Oval")) {
            System.out.println("this is an Oval");
    
        }
    
        else if(text.equals("Rectangle")) {
            System.out.println("this is an Rectangle");
    
        } 
    

    另外,如果你测试hasNextLine(),那么你应该调用nextLine(),而不是next(),并且你应该只为每个hasNextLine调用一次一次


    从文本文件中提取数据行时,我有时会使用多个扫描仪。例如:

    Scanner fileScanner = new Scanner(myFile);
    while (fileScanner.hasNextLine()) {
      Scanner lineScanner = new Scanner(fileScanner.nextLine());
    
      // use the lineScanner to extract tokens from the line
    
      lineScanner.close();
    }
    fileScanner.close(); // likely done in a finally block after null check
    

    【讨论】:

    • 要么调用next() 并在nextLine() 之后丢弃该行,因为OP 仅检查“椭圆”和“矩形”或拆分字符串并获取第一部分。跨度>
    • 非常感谢我不知道,再想我怎样才能摆脱NoSuchElementException ?,不应该可以使用hasNextLine() 循环遍历文件吗?
    • @RootOfMinusOne:您可以按照自己喜欢的方式循环浏览文件,只要它可以工作并尊重文件的结构。我经常使用基于文件的扫描器通过hasNextLine()/nextLine() 获取每一行,然后使用单独的基于字符串的扫描器来提取行上的各个标记。但是如果你走这条路,请务必在完成后处理每个基于字符串的扫描器。
    • @RootOfMinusOne:请参阅编辑以了解我的意思的示例。
    【解决方案2】:

    您需要将 next()hasNext() 方法调用匹配以匹配单个字符串标记

    while (myFile.hasNext()) {
       String token = myFile.next();
    
        if (token.equals("Oval")) {
           System.out.println("this is an Oval");
        }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多