我有一个像这样的方法:
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/