Сканер пропускает строки текстового файла

#java #file

#java #файл

Вопрос:

Я новичок в Java, и мне нужна помощь в решении этой проблемы, с которой я столкнулся. Этот класс считывает данные из текстового файла и добавляет их в массив Movie. Проблема в том, что когда он считывает текстовый файл, он пропускает все остальные строки.

 public class ReadFile{
private File f;
Scanner sc;
int index;

public ReadFile(){
    f = new File("db.txt");
    try {
        sc = new Scanner(f);
    } catch (FileNotFoundException e) {
        System.out.println("An Error occured, File couldn't be opened.");
    }
}

public int FileRead(Movie[] film, int index){
    sc.useDelimiter(",");
    this.index = index;
        while(sc.hasNext()){
            film[index] = new Movie();
            film[index].setTitle(sc.next());
            film[index].setYear(sc.next());
            film[index].setRuntime(sc.next());
            film[index].setActorOne(sc.next());
            film[index].setActorTwo(sc.next());
            film[index].setDirector(sc.next());
            if(sc.hasNextLine()){
                sc.nextLine();
            }
            index  ;
        }
    
    System.out.println("count is "  index);
    sc.close();
    return index;
}

}
 

Комментарии:

1. Можете ли вы предоставить образец фрагмента файла?

Ответ №1:

nextLine() на самом деле не делает то, что вы думаете.

Кроме того, ни один из них не .useDelimiter(",") работает — предположительно, ваш файл представляет собой что-то вроде:

 Jurassic Park,1993,128,Jeff Goldblum,Jeff Goldblum's looks,Steven Spielberg
The Fly,1986,96,Jeff Goldblum,A fly,David Cronenberg
 

Проблема в том, что компьютер работает так, как работает компьютер. Вы сказали, что разделителем между токенами является запятая. И больше ничего. Итак, все это — один токен:

 Steven Spielberg
The Fly
 

Как и в, "Steven SpielbergnThe Fly" это то, что ваш sc.next() вызов возвращает для первого фильма в setDirector строке. Кажется глупым? Ну, вы сказали компьютеру: токены — это вещи, разделенные запятыми. Все это окружено запятыми, итак, вы просили об этом, вы получили это: это next() токен в файле. Затем вы выполняете бесполезный в противном случае вызов следующей строки, который поглощает остальную часть этой The Fly строки, что приводит не только к пропуску всех остальных фильмов, но и к искаженной комбинации каталога и названия фильма в следующей (в противном случае пропущенной) строке, искаженной вместе. Знаете, как на лету? Понял? [Примечание для себя: это фильм 1987 года, нет, они его не получат!]

Возможно, исправление заключается в том, чтобы сообщить сканеру, что либо запятая, либо новая строка считаются разделителем; .useDelimiter(",|r?n") сделал бы это. И забудьте о hasNextLine nextLine части , которая ничего не делает, вы должны просто избавиться от этого. Ваш код завершится ошибкой, если в нем есть «сломанная» строка (которая не содержит ровно 5 запятых), и эта следующая строка не решит эту проблему, поэтому избавьтесь от нее.

В качестве альтернативы, забудьте сканер — считывайте строку за строкой, используя, например Files.readAllLines , затем обрабатывайте построчно, используя .split(",") для разбиения его на части.