这是我的代码:
public int Part1(BufferedReader reader) throws IOException{
reader.mark(0);
int counter1 = 0;
String z;
while((z = reader.readLine()) != null){
counter1 = counter1 + z.length();
}
reader.reset(); // this is the error line
return counter1;
}
这是一个计算文件中字符数的代码。我有其他算法在同一个程序中运行,需要BufferedReader返回文件的开头。我查看了StackOverFlow上的另一个答案,并尝试使用mark()和reset()方法。但是,存在运行时错误:
线程中的异常" main" java.io.IOException:未标记流 在java.io.BufferedReader.reset(未知来源)
这里有什么问题?
答案 0 :(得分:3)
从mark()
的文档中,您传递给它的参数是:
你已经过了0;因此,你已经告诉它在读取0个字符区域后使标记无效,这基本上是立即的。readAheadLimit - 限制在保留标记的同时可以读取的字符数。尝试在读取字符达到此限制或更高时重置流可能会失败。大于输入缓冲区大小的限制值将导致分配一个大小不小于limit的新缓冲区。因此,应谨慎使用大值。
您的选择:
您可以传递文件大小,但请注意有关较大值的警告。
重新打开文件并为每个方法重新开始Reader
s(您可以将文件名传递给方法并让它们处理它,或者在更高级别重新打开它将闪亮的新BufferedReader
传递给每个方法。
请改用FileChannel
及其位置方法。
请改用RandomAccessFile
及其搜索方法。
切换到InputStream
而不是Reader
s(请注意您的字符编码),如果基础流是FileInputStream
,您可以使用其频道重置为开头界面,例如:
FileInputStream fileStream = ...; // once when you open the file
// For each method (us-ascii as example):
fileStream.getChannel().position(0);
BufferedReader reader = new BufferedReader(new InputStreamReader(fileStream, "us-ascii"));
// Use reader only in that method, resetting as above for each.
答案 1 :(得分:0)
另一种选择是在下次需要时再声明另一个BufferedReader,而不是不断重置相同的BufferedReader。
答案 2 :(得分:0)
我建议不要重置阅读器,因为阅读器可以坐在另一个阅读器或流或文件上,也必须重置才能工作。这可能会导致很多问题。尝试同时做两件事或打开另一个BufferedReader,但要确保它下面的流和读者也是新鲜的。
当您从文件中读取时,您可能无法通过重置获得任何内容。可能就像创建新读者一样。