BufferedReader не читает весь текстовый файл - PullRequest
0 голосов
/ 09 ноября 2018

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

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;
}

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

1 Ответ

0 голосов
/ 09 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...