как извлечь данные из текстового файла в Java

1

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

файл содержит следующее
Овал 10 10 80 90 Красный
Овал 20 20 50 60 Синий
Прямоугольник 10 10 100 100 Зеленый

Я хочу извлечь данные и передать их конкретному конструктору в соответствии с типом, указанным в начале строки.

но я получаю этот странный результат

это Oval Exception в потоке "main" 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 (собственный метод) на 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

Теги:
file
file-io

2 ответа

4
Лучший ответ

Поймите, что когда вы вызываете next() на объект Scanner, он ест следующий токен, а затем возвращает его вам. Если вы не назначаете String, возвращаемую переменной, она теряется навсегда, и при следующем вызове next() вы получаете новый токен. Намного лучше получить токен, назначить его переменной String, а затем выполнить ваши тесты if. Не вызывайте next() в булевом тестовом блоке if.

т.е. что-то вроде:

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 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
  • 0
    Либо вызовите next() и после nextLine() чтобы выбросить строку, так как OP проверяет только «Oval» и «Rectangle», либо разбейте String и выполните первую часть.
  • 0
    Большое спасибо, я не знал этого, еще один вопрос, как я могу избавиться от NoSuchElementException ?, не должно быть хорошо, чтобы использовать hasNextLine() чтобы hasNextLine() файл?
Показать ещё 2 комментария
1

Вам нужно сопоставить свой next() с hasNext() метода hasNext() для соответствия отдельному токену String

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

    if (token.equals("Oval")) {
       System.out.println("this is an Oval");
    }
    ...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню