BufferedReader не читает весь текстовый файл

Я читал, что у кого-то проблемы с BufferedReader: читатель просто не читает первые строки. Вместо этого у меня противоположная проблема. Например, в текстовом файле с 300 строками он достигает 200, считывает его половину, а затем следующей строке присваивается значение null, поэтому она останавливается.

private void readerMethod(File fileList) throws IOException {
    BigInteger steps = BigInteger.ZERO;
    BufferedReader br = new BufferedReader(new FileReader(fileList)); 

    String st;
    //reading file line by line
    try{
        while (true){
            st = br.readLine();
            if(st == null){
                System.out.println("Null string at line " + steps);
                break;
            }
            System.out.println(steps + " - " + st);
            steps = steps.add(BigInteger.ONE);
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    finally{
        try{
            br.close();
        }catch(Exception e){}
    }
}

Результат предыдущего фрагмента кода будет таким, как ожидалось, пока он не достигнет строки 199 (начиная с 0). Рассмотрим файл с 300 строками.

... 198 - 3B02D5D572B66A82F9D21EE809320DB3E250C6C9 199 - 6E2C69795CB712C27C4097119CE2C5765 Null string at line 200

Обратите внимание, что все строки имеют одинаковую длину, поэтому в этом выводе строка 199 даже не завершена. Я проверил текст файла, он правильный: он содержит все 300 строк и все они одинаковой длины. Кроме того, как видите, в тексте только заглавные буквы и цифры.

У меня вопрос: как я могу это исправить? Мне нужно, чтобы BufferedReader читал весь текст, а не только его часть.

Как кто-то спросил, я добавляю сюда оставшуюся часть кода. Обратите внимание, что все имена заглавных букв являются константами различного типа (int, string и т. Д.). Это метод, который вызывается основным потоком:

public void init(){
    BufferedWriter bw = null;
    List<String> allLines = createRandomStringLines(LINES);
    try{
        String fileName = "SHA1_encode_text.txt";
        File logFile = new File(fileName);
        System.out.println(logFile.getCanonicalPath());
        bw = new BufferedWriter(new FileWriter(logFile));

        for(int i = 0; i < allLines.size(); i++){
            //write file
            String o = sha1FromString(allLines.get(i));
            //sha1FromString is a method that change the aspect of the string,
            //replacing char by char. Is not important at the moment.
            bw.write(o + "\n");
        }

    }catch(Exception e){
        e.printStackTrace();
    }finally{
        try{
            bw.close();
        }catch(Exception e){}
    }

}

Метод создания списка случайных строк следующий. «СИМВОЛЫ» - это просто строка, содержащая все доступные символы.

private List<String> createRandomStringLines(int i) {
    List<String> list = new ArrayList<String>();
    while(i!=0){
        StringBuilder builder = new StringBuilder();
        int count = 64;
        while (count-- != 0) {
            int character = (int)(Math.random()*SYMBOLS.length());
            builder.append(SYMBOLS.charAt(character));
        }
        String generatedString = builder.toString();
        list.add(generatedString);
        i--;
    }
    return list;
}

Обратите внимание, что записанный файл полностью правильный.


person Daniele Buonadonna    schedule 09.11.2018    source источник
comment
Привет. Что такое LINES в BufferedReader br = new BufferedReader(new FileReader(fileList), LINES + 1);?   -  person Mickael    schedule 09.11.2018
comment
Ах, извините, я забыл. Это просто количество строк. Был предыдущий метод, когда я создавал случайные строки, а LINES - это просто константа типа int, чтобы создать ее более эффективно.   -  person Daniele Buonadonna    schedule 09.11.2018
comment
Почему вы вообще объявляете размер буфера для BufferedReader? Почему бы вам не использовать стандартную? Создать такой размером 301 для меня действительно странно.   -  person Amongalen    schedule 09.11.2018
comment
Расскажите, пожалуйста, каково полное содержание строки 199.   -  person ygor    schedule 09.11.2018
comment
Я делаю. Я определяю количество строк только для того, чтобы получить более четкий вывод, и потому что он мне понадобится позже. Кроме того, цикл while должен достичь файла независимо от номера строки, которая находится в данный момент. Надеюсь, что правильно ответил на ваш вопрос, надеюсь, что я что-то не понял неправильно.   -  person Daniele Buonadonna    schedule 09.11.2018
comment
Когда вы посмотрите на код BufferedReader, вы увидите, что размер - это количество знаков, а не количество строк. Я не думаю, что это проблема, но вы должны это исправить.   -  person Mickael    schedule 09.11.2018
comment
Чтобы ответить игору. Я запустил программу еще несколько раз, поэтому результат изменился. На данный момент это выглядит следующим образом: 198 - E2246565470462093EEFC83E5CCE46B0C9E07C67 199 - ED2AB7058F09C47E822AA5D0D5DFB7C9F Null string at line 200 полная строка 199 - ED2AB7058F09C47E822AA5D0D5DFB7C9F2DC96E3   -  person Daniele Buonadonna    schedule 09.11.2018
comment
Да, спасибо, Микаэль, за исправление. Но вы были правы, это не касается более серьезной проблемы.   -  person Daniele Buonadonna    schedule 09.11.2018
comment
Не могли бы вы рассказать нам, какую операционную систему и файловую систему вы используете? Не могли бы вы также поделиться с нами файлом?   -  person ygor    schedule 09.11.2018
comment
Вы пробовали запустить его вообще без объявления размера буфера?   -  person Amongalen    schedule 09.11.2018
comment
Я не боюсь. Файл генерируется случайным образом при каждом запуске. Я использую окно 10, но не понимаю, что вы имеете в виду под файловой системой.   -  person Daniele Buonadonna    schedule 09.11.2018
comment
Средиален, да, я это сделал. Но ничего не меняется. Как и ожидалось.   -  person Daniele Buonadonna    schedule 09.11.2018
comment
Windows 10 - это достаточно информации. Покажите, пожалуйста, код, который генерирует файл. Вы правильно закрываете писателя? Возможно, записанный файл не сбрасывается должным образом, прежде чем вы попытаетесь его прочитать.   -  person ygor    schedule 09.11.2018
comment
Хорошо, я собираюсь добавить код, подождите несколько минут.   -  person Daniele Buonadonna    schedule 09.11.2018
comment
Чтобы получить правильную помощь, отправьте минимальный воспроизводимый пример (минимальный - без лишних частей, таких как графический интерфейс, но полный пример кода - так что все нам нужно скопировать и вставить его на наши машины, чтобы иметь возможность запустить его и получить такое же поведение / проблему, с которой вы столкнулись). В вашем текущем примере отсутствует часть, отвечающая за создание этого 300-строчного файла.   -  person Pshemo    schedule 09.11.2018
comment
Вы также можете попробовать использовать Scanner: Scanner scan = new Scanner(file); String line; while(scan.hasNextLine()) { line = scan.nextLine(); //... } scan.close();   -  person Sofo Gial    schedule 09.11.2018
comment
Вы пробовали: java.nio.file.Files.lines(path), который читает все строки из файла как Stream?   -  person anders    schedule 09.11.2018
comment
Метод, который случайно читает файл, работает вместе с методом, который его записывает? Или читатель начинает после того, как писатель закончил?   -  person Robert Kock    schedule 09.11.2018
comment
Пожалуйста, добавьте System.out.println (писатель закрыт) ПОСЛЕ bw.close (); и добавить System.out.println (открытие читателя) ПЕРЕД BufferedReader br = new BufferedReader (новый FileReader (fileList)); В каком порядке будут появляться эти два сообщения?   -  person ygor    schedule 09.11.2018
comment
Еще одна вещь: добавьте e.printStackTrace () для перехвата (Исключение e) ПОСЛЕ bw.close ();   -  person ygor    schedule 09.11.2018
comment
Размер буфера BufferedWriter по умолчанию - 8192. Ваш читатель прекращает чтение ровно после 8192 байтов ((40 + 1) * 199 + 33. Почти наверняка ваш писатель выполнил сброс только один раз.   -  person ygor    schedule 09.11.2018
comment
Хорошо. Вот и все, игорь понял. BufferedWriter закрывается после запуска BufferedReader. Я посмотрю, как исправить эту проблему. Спасибо всем. Я дам вам знать, если что-то изменится.   -  person Daniele Buonadonna    schedule 09.11.2018


Ответы (1)


Хорошо, спасибо пользователю ygor, мне удалось решить эту проблему. Проблема заключалась в том, что BufferReader запускает свою работу, когда BufferWriter еще не закрыт. Достаточно было переместить командную строку, требующую работы читателя, после команды bufferWriter.close().

person Daniele Buonadonna    schedule 09.11.2018