如何在java中重置FileReader而不必彻底更改程序?

如何在java中重置FileReader而不必彻底更改程序?,java,file-io,bufferedreader,reset,filereader,Java,File Io,Bufferedreader,Reset,Filereader,我发现FileReader只扫描文件一次。之后,如果你想在程序中重新扫描文件,你必须关闭它并重新初始化它。我在其他博客和stackoverflow问题中读到过这方面的内容,但大多数都提到了BufferedReader或其他类型的读者。问题是我已经使用FileReader完成了我的程序,并且我不想将所有内容都更改为BufferedReader,那么是否仍可以在不引入任何其他类或方法的情况下重置文件指针?还是在我已经存在的文件读取器周围包装一个BufferedReader?下面是我专门为这个问题编写

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

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);
        }
    }
}

谢谢。

像这样使用
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
    }
但是在使用
标记()时,您应该保持自信。

BufferedReader
中的
mark
方法:
public void mark(int readAheadLimit)抛出IOException
。下面是从javadoc复制的用法:

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


BufferedReader
并不能真正解决问题。您必须将缓冲区设置得非常大,以便整个文件都保存在内存中。重新打开文件有什么不好?哦,我明白了。我对重新打开没有问题,事实上,我可能只需要在我的程序中重新打开它1-2次,但我只是想避免冗余代码,并希望我能在这里找到任何答案。如果我在这里得不到任何答案,或者如果我在实现这里给出的答案时遇到困难,那么重新打开的东西是我最后的选择。谢谢你可以试试。然而,对于跨平台兼容性并没有硬性保证。@JoopEggen它在我的机器上不工作,我想这就是平台兼容性的问题。它说java.io.IOException:reset()不受支持。非常感谢,这更简单有效。所以RandomAccessFile和FileReader一样,只是它有一个查找方法?或者对文件阅读器使用这种方法有什么利弊吗?@rohitkrishna094它们是完全不同的东西
FileReader
扩展了
InputStreamReader
,它只处理
FileInputStream
RandomAccessFile
实现了
DataOutput
DataInput
,支持对随机访问文件的读写。建议你用谷歌
RandomAccessFile
自己了解更多信息。是的,我刚查过。感谢您的及时回复,帮助我快速完成我的程序:D@rohitkrishna094正如有人说的那样,
reset
也可以工作,不是
FileReader
,而是
BufferedReader
,我只是更新了我的答案。