java - BufferedReader readLine прекращает чтение, когда получает пустую строку - PullRequest
0 голосов
/ 11 февраля 2019

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

Вот мой код:

public static void main(String[] args) {
    String string = "";

    try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
        String line;
        while ((line = br.readLine()) != null) {

            string += normalize(line);

        }
    } catch (Exception e) {

    }
    System.out.println(string);
}

public static String normalize(String string) {

    StringBuilder text = new StringBuilder(string.trim());



    for(int i = 0; i < text.length(); i++) {
        if(text.charAt(i) == ' ') {
            removeWhiteSpaces(i + 1, text);
        }
    }

    if(text.charAt(text.length() - 1) != '.') {
        text.append('.');
    }

    text.append("\n");
    return text.toString();
}

public static void removeWhiteSpaces(int index, StringBuilder text) {
        int j = index;
        while(text.charAt(j) == ' ') {
            text.deleteCharAt(j);
        }
    }

, а вот текстовый файл, который я использую:

abc .

 asd.



 dasd.

Ответы [ 6 ]

0 голосов
/ 11 февраля 2019

Проблема не в вашем коде, а в понимании метода readLine().В документации указано:

Читает строку текста.Строка считается завершенной любым из перевода строки ('\ n'), возврата каретки ('\ r') или возврата каретки, за которым сразу следует перевод строки.

https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine()

Так что это означает, что если метод найдет пустую строку, он прекратит чтение и вернет null.

Код, предложенный @ tijn167, сделает обходной путь, используя BufferedReader,Если вы не ограничены в BufferedReader, используйте ScanReader, как предложено @Abhishek Soni.

Кроме того, ваш метод removeWhiteSpaces() проверяет наличие пробелов, в то время как пустые строки - это не пробелы, а возврат переноса \r или перевод строки \n или оба.Итак, ваше состояние text.charAt(j) == ' ' никогда не выполняется.

0 голосов
/ 11 февраля 2019

Это вызывает функция нормализации.следующее исправление должно исправить это:

public static String normalize(String string) {

        if(string.length() < 1) {
            return "";
        }
        StringBuilder text = new StringBuilder(string.trim());
        if(text.length() < 1){
            return "";
        }


        for(int i = 0; i < text.length(); i++) {
            if(text.charAt(i) == ' ') {
                removeWhiteSpaces(i + 1, text);
            }
        }

        if(text.charAt(text.length() - 1) != '.') {
            text.append('.');
        }

        text.append("\n");
        return text.toString();
    }
0 голосов
/ 11 февраля 2019

Я думаю, что у вас есть проблема в removeWhiteSpaces(i + 1, text);, и если у вас есть проблема в строковом процессе, читатель не сможет прочитать следующую строку.

Вы не проверяете пустую строку, иВы звоните text.charAt(text.length()-1), это тоже проблема.

Распечатайте исключение, измените блок catch, чтобы выписать исключение:

} catch (Exception e) {
    e.printStackTrace();
}

Причина в вашем while(text.charAt(j) == ' ') {,Вы не проверяете длину StringBuilder, но удаляете ее ...

0 голосов
/ 11 февраля 2019

Вторая строка вашего файла пуста, поэтому цикл while останавливается

0 голосов
/ 11 февраля 2019

Попробуйте ScanReader

 Scanner scan = new Scanner(is);
 int rowCount = 0;
 while (scan.hasNextLine()) {
             String temp = scan.nextLine();

             if(temp.trim().length()==0){
                 continue;
             }
}

// Остальная часть вашей логики

0 голосов
/ 11 февраля 2019

Попробуйте это:

   while ((line = br.readLine()) != null) {
        if(line.trim().isEmpty()) {
            continue;
        }
         string += normalize(line);
      }
...