我有一段代码,它使用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");
答案 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');
}