java-BufferedReader readLine在encouters空字符串时停止读取

时间:2019-02-11 11:47:53

标签: java file bufferedreader readline

我正在使用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 :(得分:3)

我认为您在removeWhiteSpaces(i + 1, text);中遇到问题,如果您在字符串处理过程中遇到问题,读者将无法阅读下一行。

您不检查空字符串,而是致电text.charAt(text.length()-1),这也是一个问题。

打印异常,更改您的catch块以写出异常:

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

原因是在您的while(text.charAt(j) == ' ') {中,您没有检查StringBuilder的长度,但是将其删除了...

答案 1 :(得分:1)

尝试一下:

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

答案 2 :(得分:1)

尝试使用ScanReader

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

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

//您的逻辑其余部分

答案 3 :(得分:1)

归一化功能导致了此问题。 对其进行以下调整可以解决此问题:

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

答案 4 :(得分:1)

问题不在于您的代码,而在于对readLine()方法的理解。在文档中指出:

  

读取一行文本。一行被认为由换行符('\ n'),回车符('\ r')或回车符后紧跟换行符之一终止。

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

因此,这意味着如果该方法找到空行,它将停止读取并返回null

@ tijn167建议的代码将使用BufferedReader来解决。如果您对BufferedReader不拘一格,请按照@Abhishek Soni的建议使用ScanReader

此外,您的方法removeWhiteSpaces()正在检查空白,而空行不是空白,而是进位返回\r或换行符\n或两者都检查。因此,您的条件text.charAt(j) == ' '永远不会满足。

答案 5 :(得分:-1)

文件第二行为空,因此while循环停止