java - 包裹在文件读取器周围的 bufferedreader 是否从文件读取器获取其文件指针?

标签 java bufferedreader filereader file-pointer

我有一个像这样的方法:

public void LoadFromFile(){
String record;
try{
        FileReader reader = new FileReader("Friends.txt");  
        BufferedReader bin = new BufferedReader(reader);
        while((record = bin.readLine()) != null){
             //do some stuff
        }
        clientinfo = homeAddress.LoadFromFile(reader);

上面调用的方法 homeAddress.LoadFromFile(reader) 在另一个类中,如下所示:

public String[] LoadFromFile(FileReader areader){
String record;
    try{
        BufferedReader bin = new BufferedReader(areader);
        while((record = bin.readLine()) != null){
             //do some stuff
            }
        }
        bin.close();
        bin = null;

我的问题是,我始终使用相同的 FileReader,因此当我将 BufferedReader 包裹在它周围时,BufferedReader 是否使用 FileReader 中的文件指针(从哪里开始读取)?

第一个 BufferedReader 是否会更新文件指针,以便第二个 BufferedReader 知道从哪里开始?

最佳答案

这里的关键是“缓冲”这个词。不,您不能假设第二个 LoadFromFile 中的 BufferedReader 会准确地从调用者中的 BufferedReader 停止的地方继续。来自 the documentation :

Reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.

(我的重点)

这意味着 BufferedReader 将提前读取文件并将该数据保存在其缓冲区中。因此,第二个 BufferedReader 将拾取第一个 BufferedReader 未读取的第一个字符 - 因此,您从第一个 BufferedReader 消耗的内容和您所消耗的内容之间很可能存在差距。从第二个开始消耗。

相反:将 BufferedReader 传递到第二个方法中,相应地更改其签名。

总的来说,它的签名已经有点不对劲了。它不需要知道或关心它是从文件还是其他类型的流中读取;它需要知道的是它正在从 BufferedReader 读取(因为它依赖于 readLine)。

<小时/>

旁注:在您的代码中,如果读取时发生异常,您将没有机会清理读取器分配的非 JVM 资源(特别是 FileReader) 。这就是 try-with-resources 真正有用的地方:

try (
    FileReader reader = new FileReader("Friends.txt");  
    BufferedReader bin = new BufferedReader(reader);
) {
    while((record = bin.readLine()) != null){
         //do some stuff
    }
    clientinfo = homeAddress.LoadFromFile(reader);

即使 readLine 中发生异常,读取器也会被清理。

关于java - 包裹在文件读取器周围的 bufferedreader 是否从文件读取器获取其文件指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45658747/

相关文章:

java - 用于负整数和正整数的 DocumentFilter

java - 如何递归地将栈顶元素交换到栈底

java - 如何将图片导入到Android项目中?

java - 我应该如何从缓冲阅读器中读取内容?

java - BufferedReader 一直等待响应

javascript - 文件读取器在 Chrome 中不工作

java - 使用 try-with-resources 包围扫描仪

java - 不输入 Y/N 时返回错误

go - bufio.Writer写入后,bufio.Reader不会从文件中读取任何内容

java - 从java程序中删除硬编码文件路径