Java 如何读取BufferedReader两次或多次?

Java 如何读取BufferedReader两次或多次?,java,io,inputstream,bufferedreader,Java,Io,Inputstream,Bufferedreader,我有一个每行一个整数的文本文件- 10 20 50 我想把这些数字读两遍甚至几遍。我尝试了一些代码,但失败了。如何更改代码以打印列表两次 import java.io.BufferedReader; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.InputStreamReader; public class DoubleBuffer { public static voi

我有一个每行一个整数的文本文件-

10
20
50
我想把这些数字读两遍甚至几遍。我尝试了一些代码,但失败了。如何更改代码以打印列表两次

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class DoubleBuffer {

    public static void main(String[] args) {

        try {

            FileInputStream fstream = new FileInputStream("c:/files/numbers.txt");

            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String strLine;

                // Read rows
                while ((strLine = br.readLine()) != null) {
                    System.out.println(strLine);
                }   

                // Read rows again
                while ((strLine = br.readLine()) != null) {
                    System.out.println(strLine);
                }

            in.close();
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }//try-catch

    }// main

}// class
您可以使用
mark()
reset()
或只是再次打开文件。根据您的使用情况,您是否希望将数据存储在内存中


参考-

现在您可以多次打印

BufferedReader br = new BufferedReader(new FileReader( "D:/log_2071-04-31.txt" ));
String strLine;
ArrayList<String> ans= new ArrayList<String>();

// Read rows
while ((strLine = br.readLine()) != null) {
    System.out.println(strLine);
    ans.add(strLine);
}

// Read again
for (String result: ans) {
    System.out.println(result);
}
BufferedReader br=new BufferedReader(新文件读取器(“D:/log2071-04-31.txt”);
弦斯特林;
ArrayList ans=新的ArrayList();
//读行
而((strLine=br.readLine())!=null){
系统输出打印LN(斯特林);
ans.add(strLine);
}
//再读一遍
for(字符串结果:ans){
系统输出打印项次(结果);
}

多次阅读同一内容会导致性能不佳。。。
除非您有非常充分的理由进行多次读取,否则请在main方法的开头进行读取,并将数据存储在适合您需求的数据结构中

还有另一种可能性:将侦听器连接到
多读卡器

interface Listener {
    void read(String line);
}

class MultiReader {
    final List<Listener> listeners = new ArrayList<Listener>();

    public void addListener(Listener l) {
        this.listeners.add(l);
    }

    public void read(File file) throws IOException {
        final BufferedReader br = new BufferedReader(new FileReader(file));
        try {
        String line;
            while ((line = br.readLine()) != null) {
                for (Listener l : this.listeners) {
                    l.read(line);
                }
            }
        } finally {
            br.close();
        }
    }
}

因此,文件被读取一次,它可以处理大文件,因为文件的内容不在内存中。

将其存储在列表中或重新启动缓冲区/如果“内存不是问题”,则可以将整个输入存储为
字节[]
然后根据需要创建一个
ByteArrayInpuStream
。将它们存储在列表中是很理想的。@ChristianMark-yes有意义。重新读取文件需要两倍的IO。此外,我们需要在读取行时使用相同的内存两次来存储行。对吗???请不要使用DataInputStream来阅读文本,也请将其从示例中删除,这个坏主意经常被复制。你能告诉我如何在这里使用标记和重置吗?另外,如何再次打开该文件?是否必须使用此代码重新打开文件-FileInputStream fstream2=newfileinputstream(“c:/files/numbers.txt”)?是的,有道理。重新读取该文件将需要两倍的IO。请不要使用DataInputStream读取文本,也请将其从示例中删除,这一坏主意经常被复制。甘尼什-请阅读下面Berryllium所说的内容。“数据结构在堆内存中,如果你有大文件,你可能会遇到OutOfMemoryError。如果你的应用程序是多线程的,这个问题可能会更快出现。如果你使用数据结构,你对文件大小施加了限制。”我不确定这个答案是否应该成为一个社区wiki。由于我的文件太小,解决方案对我来说会很有效。谢谢。但在我看来这太复杂了。与数据结构相比,使用这种方法有什么优势吗?@动动脑筋,它可以处理大文件。而数据结构在堆内存中,如果您有大文件,则可能会遇到
OutOfMemoryError
。如果您的应用程序是多线程的,那么这个问题可能会出现得更快。如果使用数据结构,则会对文件大小施加限制。至于其复杂性:如果将
ActionListener
附加到
JButton
,则是相同的模式-这是一个回调。你可能会在很多地方使用/找到这种模式。
 import java.io.BufferedReader;
 import java.io.DataInputStream;
 import java.io.FileInputStream;
 import java.io.InputStreamReader;

 public class DoubleBuffer {

public static void main(String[] args) {

    try {

        FileInputStream fstream = new FileInputStream("c:/files/numbers.txt");

        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;

            // Read rows
            while ((strLine = br.readLine()) != null) {
                System.out.println(strLine);
            }   
            // return stream to top of file
            fstream.getChannel().position(0);
            br=new BufferedReader(new InputStreamReader(fstream));


            // Read rows again
            while ((strLine = br.readLine()) != null) {
                System.out.println(strLine);
            }

        in.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }//try-catch

}// main

 }// class
 import java.io.BufferedReader;
 import java.io.DataInputStream;
 import java.io.FileInputStream;
 import java.io.InputStreamReader;

 public class DoubleBuffer {

public static void main(String[] args) {

    try {

        FileInputStream fstream = new FileInputStream("c:/files/numbers.txt");

        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;

            // Read rows
            while ((strLine = br.readLine()) != null) {
                System.out.println(strLine);
            }   
            // return stream to top of file
            fstream.getChannel().position(0);
            br=new BufferedReader(new InputStreamReader(fstream));


            // Read rows again
            while ((strLine = br.readLine()) != null) {
                System.out.println(strLine);
            }

        in.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }//try-catch

}// main

 }// class