how to extract data from text file in Java

2019-08-12 03:37发布

while (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"); }

the file contains the following
Oval 10 10 80 90 Red
Oval 20 20 50 60 Blue
Rectangle 10 10 100 100 Green

I want to extract the data and pass them to a specific constructor according to the type indicated at the beginning of the line.

but I am getting this weird output

this is an Oval Exception in thread "main" java.util.NoSuchElementException this is an Rectangle at java.util.Scanner.throwFor(Scanner.java:907) this is an Rectangle at java.util.Scanner.next(Scanner.java:1416) at TestMain.main(TestMain.java:33) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Process finished with exit code 1

2条回答
在下西门庆
2楼-- · 2019-08-12 03:39

Understand that when you call next() on a Scanner object, it eats the next token, and then returns it to you. If you don't assign the String returned to a variable, it's lost forever, and the next time you call next() you get a new token. Much better to get the token, assign it to a String variable and then do your if tests. Don't call next() in the if boolean test block.

i.e., something like:

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");

    } 

Also, if you test for hasNextLine() then you should call nextLine(), not next(), and you should call it only once for each hasNextLine.


When extracting lines of data from a text file, I sometimes use more than one Scanner. For instance:

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
查看更多
聊天终结者
3楼-- · 2019-08-12 03:50

You need to match your next() with a hasNext() method call to match an individual String token

while (myFile.hasNext()) {
   String token = myFile.next();

    if (token.equals("Oval")) {
       System.out.println("this is an Oval");
    }
    ...
}
查看更多
登录 后发表回答