#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(",")
для разбиения его на части.