#java
#java
Вопрос:
У меня есть два файла в каталоге. В обоих из них есть строки текста. Согласно Notepad , каждая строка имеет CRLF. Мой класс ReadFile считывает один файл, а не другой, и не другой.
private FileRead fileRead = new FileRead();
private JobSiteData jobSiteData = new JobSiteData();
private String path = "C:/Users/Antonio/IdeaProjects/JobSearch/websiteTest/";
Если я раскомментирую блок и закомментирую другой блок, он работает нормально.
@Test
void setAllText_ItReturnsAllLinesFromSite_arrayListOfLinesFromSite() throws IOException {
// ArrayList<String> thisWorks = new ArrayList<>();
// thisWorks = fileRead.getLinesFromFile(path "allTextTest.txt");
// for (String s : thisWorks) {
// System.out.println(s);
// }
ArrayList<String> thisDoesntWork = new ArrayList<>();
thisDoesntWork = fileRead.getLinesFromFile(path "goDaddySplitTestAllLines.txt");
for (String s : thisDoesntWork) {
System.out.println(s); // prints "File is empty."
}
}
Вот мой класс FileRead.
public class FileRead {
private String fileName;
private ArrayList<String> linesFromFile = new ArrayList<>();
private Scanner fileScanner;
public ArrayList<String> getLinesFromFile(String fileName) {
this.fileName = fileName;
setLinesFromFile();
if (isFileEmpty()) {
linesFromFile.add("File is empty.");
}
return linesFromFile;
}
private void setLinesFromFile() {
File file = new File(fileName);
if (doesFileExist(file)) {
readFile();
closeFileReader();
}
}
private Boolean doesFileExist(File file) {
try {
fileScanner = new Scanner(file);
} catch (FileNotFoundException e) {
linesFromFile.add("File does not exist.");
return false;
}
return true;
}
private void readFile() {
if (fileScanner != null) {
if (!linesFromFile.isEmpty()) {
linesFromFile.clear();
}
while (fileScanner.hasNextLine()) {
linesFromFile.add(fileScanner.nextLine());
}
}
}
private void closeFileReader() {
if (fileScanner != null) {
fileScanner.close();
}
}
private boolean isFileEmpty() {
return linesFromFile.size() == 0;
}
}
ОБНОВЛЕНИЕ: я обнаружил проблему. По какой-то причине эта строка в файле приводит к тому, что сканер не читает строки.
«Набор продуктов GoDaddy для повышения производительности помогает миллионам малых предприятий запускать и развивать свои предприятия. Мы ищем инженера, увлеченного разработкой программного обеспечения, который поможет ускорить наш рост. Если вы хотите создавать приложения мирового класса в инфраструктуре общедоступного облака с использованием JavaScript и React, изучать новые вещи и работать с интересной командой, мы хотим встретиться с вами!»
Эта строка является четвертой строкой ниже. Если я удалю его и все, что после него, сканер будет работать нормально. Если я удалю все в файле и в качестве первой строки в файле останется только эта строка, это тоже не сработает. Кто-нибудь знает, почему это?
Комментарии:
1. Что вы подразумеваете под «не считывает файл»? — какое плохое поведение вы получаете? — О … только что заметил комментарий в вашем коде. Таким образом, вы просто не получаете строк в одном случае, верно?
2. Это задание для вашего отладчика. Пройдитесь по коду и посмотрите, что происходит. Я ожидаю, что вы найдете место в своем коде, где код выходит из цикла чтения, думая, что в файле больше нет данных. — возможно, вы также захотите вместо этого или в дополнение добавить некоторые инструкции печати, которые помогут вам увидеть, что происходит. — например, возможно, код считает, что файл не существует. Запуск в отладчике или добавление некоторых инструкций печати сказали бы вам об этом.
3. @Steve Да, я получаю сообщение «Файл пуст». Я прошел через отладчик. Как сказано в исходном сообщении. «nextline ()» Я имею в виду, что это то, где я заканчиваю. Он вообще ничего не читает. Тем не менее, в файле есть текст.
4. Более важная строка —
filescanner.hasNextLine()
потому что это то, что вернет ‘false’ и завершит цикл. Эта строка должна быть возвращенаfalse
сразу, иначе вы получили бы по крайней мере пустые строки вlinesFromFile
, и вы не получили бы сообщение «файл пуст», верно? — Я не вижу никаких проблем в вашем коде.5. Да, это верно. Я тоже не вижу никаких проблем. У меня есть другие файлы в том же каталоге, и он отлично их считывает. Это всего лишь один конкретный файл, который он не будет читать.