gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:26:05 25 4
gpt4 key购买 nike

我有一个像这样的方法:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com