如何返回Bufferedreader的开头?

时间:2015-03-05 22:15:10

标签: java bufferedreader reset

这是我的代码:

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(未知来源)

这里有什么问题?

3 个答案:

答案 0 :(得分:3)

mark()的文档中,您传递给它的参数是:

  

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

你已经过了0;因此,你已经告诉它在读取0个字符区域后使标记无效,这基本上是立即的。

您的选择:

  • 您可以传递文件大小,但请注意有关较大值的警告。

  • 重新打开文件并为每个方法重新开始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,但要确保它下面的流和读者也是新鲜的。

当您从文件中读取时,您可能无法通过重置获得任何内容。可能就像创建新读者一样。