到达EOF后bufferedReader会关闭阅读器吗?

时间:2014-02-10 14:37:03

标签: java

我有一段代码,它使用BufferedReader从文件中读取并标记读取器的当前位置,以便在需要时可以重置为最后一行。但是我得到了一个I / O异常而且我不是正面的原因。这段代码处于一个更大的循环中,也使用了read方法,这就是我在遇到“From:”时重置的原因。

while((line=reader.readLine())!=null && line.indexOf("From:")!=0) {   
    emailMsg.append(line).append("\n");
    reader.mark(0);
}

reader.reset(); //io exception: mark invalid
emailMsg.append(".\n");

2 个答案:

答案 0 :(得分:1)

传递给mark()的参数是readAheadLimit。来自documentation

  

readAheadLimit - 限制在保留标记的同时可以读取的字符数。尝试在读取字符达到此限制或更高时重置流可能会失败。大于输入缓冲区大小的限制值将导致分配一个大小不小于limit的新缓冲区。因此,应谨慎使用大值。

由于您已指定0,并且下一个readLine()调用最终会从流中读取内容,因此随后的reset可能会因超出限制而失败。< / p>

当您告诉流“标记”某个位置时,您指定一个预读限制,它基本上告诉流“记住”那么多字符。只要您读取超出限制,您就可以调用reset()您想要的次数,它会将其重置回“记住的”字符集的开头。但是,当您读取过去该限制时,该标记无效,因此对reset()的后续调用将失败。在您的情况下,您已指定预读限制0,这意味着任何读取超过当前点将使标记无效,这就是您所看到的。

要解决此问题,请指定非零预读限制。

答案 1 :(得分:0)

对我而言,就像你从阅读器读取的行不包含“From:”序列一样,因此执行不会进入while循环,所以标记没有设置,并且当while循环体后执行继续,reset会抛出异常,因为未按照reset() documentation设置标记。

你宁愿需要这个:

boolean marked = false;
while ((line = reader.readLine()) != null) {
    if (line.indexOf("From:") != 0) {
        continue;
    }
    emailMsg.append(line).append('\n');
    reader.mark(0);
    marked = true;
}
if (marked) {
    reader.reset();
    emailMsg.append('\n');
}