当前位置: 首页 > 知识库问答 >
问题:

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

太叔志文
2023-03-14

我有这样一种方法:

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;

我的问题是,我始终使用相同的文件读取器,所以当我将BufferedReader包装在它周围时,BufferedReader是否使用文件读取器的文件指针(从哪里开始读取)?

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

共有2个答案

孙承弼
2023-03-14

从BufferedReader的源代码中可以看出,它有一个内部变量nextChar,用于读取下一个字符的索引,因此除非您自己存储变量或传递BufferedReader实例,“指针”将不会进行下一次调用。

这非常简单,可以测试:

朋友。txt:

foo
bar

代码:

import org.junit.Test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReadingTest {
    @Test
    public void LoadFromFile() throws IOException {
        String record;
        try {
            FileReader reader = new FileReader("Friends.txt");
            BufferedReader bin = new BufferedReader(reader);
            while ((record = bin.readLine()) != null) {
                System.out.println("1: read " + record);
                break;
            }
            LoadFromFile(reader);
        } catch (FileNotFoundException foo) {
            System.out.println("file not found from " + new File(".").getAbsolutePath());
        }
    }
    public void LoadFromFile(FileReader areader) {
        String record;
        try {
            BufferedReader bin = new BufferedReader(areader);
            while ((record = bin.readLine()) != null) {
                System.out.println("2: read " + record);
            }
            bin.close();
            bin = null;
        } catch (IOException ex) {
            throw new IllegalStateException(ex);
        }
    }
}

执行:

1: read foo

Process finished with exit code 0

所以第二个读者甚至没有机会阅读,即使第一次阅读没有完成。还有,如果你介绍宾。close()在第一次读取之后,第二次读取将抛出java。伊奥。IOException:流已关闭

正如评论中所建议的,如果您想继续阅读第一个方法停止的第二个方法,最简单的方法是传递同一个bufferedreader实例。你必须小心在合适的时间释放资源。

微生阳平
2023-03-14

这里的关键是缓冲这个词。不,您不能假设第二个LoadFromFile中的BufferedReader将在调用者中的BufferedReader离开的地方准确拾取。从留档:

从字符输入流读取文本,缓冲字符,以便高效读取字符、数组和行。

(我的重点)

这意味着BufferedReader将读取文件中的数据并将其保存在缓冲区中。因此,第二个BufferedReader将拾取第一个未读的第一个字符

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

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

旁注:在您的代码中,如果在读取时发生异常,您将没有机会清理读卡器分配的非JVM资源(尤其是文件读取器)。这就是“资源试用”真正有用的地方:

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中发生异常,也会清理读取器。

 类似资料:
  • 我们使用Spark CSV reader读取CSV文件以转换为DataFrame,并在上运行该作业,它在本地模式下运行良好。 我们在中提交spark作业。 错误日志:

  • 问题内容: 我正在尝试读取“ file.txt”,然后使用Golang将内容放入变量中。这是我尝试过的… 文件已成功读取,并且从 os.Open 返回的返回类型为 * os.File 问题答案: 这取决于您要执行的操作。 它输出&{0xc082016240}的原因是因为您正在打印文件描述符()的指针值,而不是文件内容。要获取文件内容,可以从文件描述符中获取。 要将所有文件内容(以字节为单位)读取到

  • 我有以下代码来读取java文件,并打印出行。我通过两种方式实现了它: 使用流: 使用循环: 我被告知这是错误的,使用缓冲读取器是错误地使用了语言的特性。有没有更好的方法,我想知道使用语言功能的正确方法。

  • 问题内容: 我有一个很大的PDF文件,它是建筑物的平面图。它具有用于所有办公家具的图层,包括座位位置的文本框。 我的目标是使用PHP读取此文件,在文档中搜索文本层,获取其内容和文件中的坐标。这样,我可以绘制出座位位置-> x / y坐标。 有没有办法通过PHP做到这一点?(如果需要的话,甚至可以是Ruby或Python) 问题答案: 签出FPDF(使用FPDI): http://www.fpdf.

  • 我有一个名为“add”的方法,它将字符串作为参数,并使用bufferedwriter将其写入文件。完成此操作后,bufferedwriter将被刷新。 在另一个方法“read”中,我遍历文件中的行,但这些行是空的(因此我不能打印它们)。

  • 问题内容: 我想知道我怎么可以将文件加载从文件夹到我的close方法。到目前为止的代码: 启动时控制台错误输出: 问题答案: 如果您想从jar文件中加载文件(例如,从classpath加载),请参阅此答案以获取有关如何获取的更多选项。在下面的代码中,我没有进行任何异常处理,并删除了您的相关代码。 编辑: 似乎您在文件夹结构上做错了什么,或者您使用了错误的包/文件名。只是要清楚。目前,您似乎在一个程