【问题标题】:How to reset FileReader in java without having to change my program drastically?如何在 java 中重置 FileReader 而无需彻底更改我的程序?
【发布时间】:2026-01-29 16:55:01
【问题描述】:

我发现FileReader 扫描文件only 一次。之后,如果您需要在程序中,您必须关闭它并重新初始化它以重新扫描文件。我在其他博客和 * 问题中读到过这一点,但其中大多数都提到了BufferedReader 或其他类型的读者。问题是我已经使用FileReader 完成了我的程序,并且我不想将所有内容都更改为BufferedReader,所以无论如何都可以在不引入任何其他类或方法的情况下重置文件指针?或者无论如何只是在我已经存在的FileReader 周围包裹一个BufferedReader?这是我专门为这个问题编写的一个小代码,如果我可以将BufferedReader 包裹在我的FileReader 周围,我希望你用这个代码sn-p 来做。

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

public class Files {
    public static void main(String args[]) throws IOException{
        File f = new File("input.txt");
        FileReader fr = new FileReader(f);
        int ch;
        while((ch = fr.read()) != -1){
         // I am just exhausting the file pointer to go to EOF
        }
        while((ch = fr.read()) != -1){
        /*Since fr has been exhausted, it's unable to re-read the file now and hence 
        my output is empty*/
            System.out.print((char) ch);
        }
    }
}

谢谢。

【问题讨论】:

  • BufferedReader 并不能真正解决问题。您必须使缓冲区如此之大,以使整个文件都保存在内存中。重新打开文件有什么不好?
  • 哦,我明白了。我对重新打开没有问题,事实上,我可能只需要在我的程序中重新打开它 1-2 次,但我只是想避免冗余代码,并希望我能在这里找到任何答案。重新开放是我最后的手段,以防我在这里没有得到任何答案,或者我最终无法执行这里给出的答案。谢谢
  • 你可以试试reset()。但是,跨平台兼容性没有硬性保证。
  • @JoopEggen 它在我的机器上不起作用,我想这是平台兼容性问题。它说 java.io.IOException: reset() not supported.

标签: java file-io bufferedreader reset filereader


【解决方案1】:

像这样使用java.io.RandomAccessFile

    RandomAccessFile f = new RandomAccessFile("input.txt","r"); // r=read-only
    int ch;
    while ((ch = f.read()) != -1) {
        // read once
    }

    f.seek(0); // seek to beginning

    while ((ch = f.read()) != -1) {
        // read again
    }

EIDT ------------
BufferedReader 也可以:

    BufferedReader br = new BufferedReader(new FileReader("input.txt"));
    br.mark(1000); // mark a position

    int ch;
    if ((ch = br.read()) != -1) {
        // read once
    }

    br.reset(); // reset to the last mark

    if ((ch = br.read()) != -1) {
        // read again
    }

但你在使用mark()时要谨慎:
BufferedReader 中的 mark 方法:public void mark(int readAheadLimit) throws IOException。这是从 javadoc 复制的用法:

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

【讨论】:

  • 非常感谢,这更简单有效。那么 RandomAccessFile 与 FileReader 相同,只是它有一个 seek 方法?或者对 FileReader 使用它有什么利弊?
  • @rohitkrishna094 它们是完全不同的东西。 FileReader extendsInputStreamReader,它只处理FileInputStreamRandomAccessFile 实现了DataOutputDataInput支持读取和写入随机访问文件。建议您googleRandomAccessFile自行了解更多。
  • 是的,我刚刚检查过了。感谢您的及时回复,帮助我快速完成了我的程序。 :D
  • @rohitkrishna094 正如有人说reset 也有效,不是FileReader 而是BufferedReader,我刚刚更新了我的答案。
最近更新 更多