Почему Scanner nextLine () считывает один файл, но не другой в том же каталоге?

#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. Да, это верно. Я тоже не вижу никаких проблем. У меня есть другие файлы в том же каталоге, и он отлично их считывает. Это всего лишь один конкретный файл, который он не будет читать.