当达到空行时,BufferedReader停止读取

时间:2014-12-05 08:44:11

标签: java bufferedreader

我有一个正在读取文件的BufferedReader。该文件很容易在两段ex:

之间有一个空行
  

Lorem ipsum dolor sit amet,mel in docendi eleifend sapientem,mei cu natum possit salutandi。 Quaeque legimus dressat cum in,tamquam cotidieque duo in.Justo ubique efficiantur ei sit,idque dicat sadipscing ad sit。 Amet consul disputationi ei sea。在reque lorem quo,动物singulis per cu,usu euripidis reprimique inciderint eu。

     

Ocurreret dissentias ei per。 Copiosae vulputate vel ei,ne est dissentias adversarium,ad quo graecis nostrum volutpat。 Vix ut sale persequeris,id est volumus noluisse,mel et ridens molestiae。 Ut qui iriure volutpat contentiones,unum propriae inciderint ut duo。 Ei singulis delicata per。 Usu verterem nominati in。

BufferedReader在到达第一段结尾时停止读取。我知道为什么只要找到一个空行就会停止,它认为这是文件的结尾,这是我的问题。

我一直在使用while循环方式遍历文件。

我已经把这个问题搞砸了,所以我废弃了我原来的bufferedreader方法并编辑了很多次,但它是这样的:(伪代码,这段代码不正确。主要注意while循环)

public static String currenttxt() throws IOException {
   BufferedReader br = new BufferedReader(new FileReader(file)); 
     try {
        while (br.readLine() != null) {
           return br.readline();
        }
     } catch (Exception e) {
        e.PrintStackTrace();
     }
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

正如在已经提到的评论中,由于while (br.readLine()),您的函数正在丢弃第一行,并在读取第二行后离开循环。

你应该在一些局部变量中保留已经读过的行。

public static String currenttxt() throws IOException {

       try (BufferedReader br = new BufferedReader(new FileReader(file))) {
       StringBuilder b = new StringBuilder();
         try {

            String line = br.readLine();
            while (line != null) {
               b.append(line);
               b.append(System.getProperty("line.separator"));
               line = br.readLine();
            }

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

         // remove the last line separator at the end using trim()
         return b.toString().trim();
       }

使用java 7可以简化为

public static String currenttxt() throws IOException{
    List<String> lines; 
    lines = Files.readAllLines(FileSystems.getDefault()
             .getPath(file.getAbsolutePath()));

    StringBuilder b = new StringBuilder();
    boolean insertNewLine = false;
    for (String line : lines) {
        if (insertNewLine) 
            b.append(System.getProperty("line.separator"));

        b.append(line);
        insertNewLine = true;       
    }

    return b.toString();
}

第二个例子说明了如何避免最后trim()的方法。 另一种方法是从StringBuilder b删除最后一行分隔符。

答案 1 :(得分:1)

您应该初始化一个变量,并在每次读取一行时为其分配一个值以避免此问题:

    BufferedReader br = new BufferedReader(new FileReader(file));
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        line = br.readLine();
    }

    return sb.toString();

如果你想保留段落之间的空行,最好按字符读取:

    BufferedReader br = new BufferedReader(new FileReader(file));
    StringBuilder sb = new StringBuilder();
    int c = br.read();

    while (c != -1) {
        sb.append(String.valueOf((char)c));
        c = br.read();
    }

    return sb.toString();