Java 使用一个BufferedReader读取多个文件?

Java 使用一个BufferedReader读取多个文件?,java,Java,因此,我能够从现有文件中读取如下内容: File file = new File("C:\\Something/test.txt"); FileInputStream fis = new FileInputStream(file); BufferedReader bfr = new BufferedReader(new InputStreamReader(fis)); 现在我可以使用bfr.readLine()并逐行阅读。 如果我想读取另一个文件,我是否必须创建一个新的

因此,我能够从现有文件中读取如下内容:

    File file = new File("C:\\Something/test.txt");
    FileInputStream fis = new FileInputStream(file);
    BufferedReader bfr = new BufferedReader(new InputStreamReader(fis));
现在我可以使用bfr.readLine()并逐行阅读。
如果我想读取另一个文件,我是否必须创建一个新的BufferedReader,或者是否有任何方法可以使用一个BufferedReader读取多个文件?

您可以使用
SequenceInputStream
按顺序读取文件

File file1 = new File("C:\\Something/test1.txt");
File file2 = new File("C:\\Something/test2.txt");
FileInputStream fis1 = new FileInputStream(file1);
FileInputStream fis2 = new FileInputStream(file2);
SequenceInputStream is = new SequenceInputStream(fis1, fis2);
BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
正确关闭流 要关闭这两个流(和读卡器),只需使用
try with resources

    try (
            FileInputStream fis1 = new FileInputStream(file1);
            FileInputStream fis2 = new FileInputStream(file2);
            SequenceInputStream is = new SequenceInputStream(fis1, fis2);
            BufferedReader bfr = new BufferedReader(new InputStreamReader(is))
    ) {
        System.out.println(bfr.readLine());
        System.out.println(bfr.readLine());
    }
使用两个以上的流 如果有两个以上的流,我们必须使用接受
InputStream
s的
Enumeration
的构造函数。正如蜘蛛@Boris提到的,这里的棘手部分是正确地关闭所有的流。我们可以创建一个
Autoclosable
,它将包含所有要关闭的
InputStream
,但是,在构造该容器之前,但在已经构造了一些流之后,可能会发生异常,因此一些流将保持未关闭状态

一种干净的方法是在
try with resources
语句中显式包含所有流:

    try (
            FileInputStream fis1 = new FileInputStream(file1);
            FileInputStream fis2 = new FileInputStream(file2);
            FileInputStream fis3 = new FileInputStream(file3);
            ...
            SequenceInputStream is = new SequenceInputStream(new IteratorEnumeration<>(Arrays.asList(fis1, fis2, fis3, ...).iterator()));
            BufferedReader bfr = new BufferedReader(new InputStreamReader(is))
    ) {
        // .. read from bfr
    }

“如果我想读取另一个文件,我是否必须创建一个新的
BufferedReader
”-否;但是您需要一个新的
FileInputStream
。看见此外,要确保所有文件都正确关闭也有点棘手。@BoristheSpider什么是棘手的部分?我看不到。@YassinHajaj即使发生错误,您如何确保所有文件都正确关闭?@Boristeider是否可以尝试使用Resources来帮助完成此操作?这些都是可关闭的实现。也许我错过了什么。真的很好奇……这并没有解决关闭流的问题——这可能是最棘手的部分。回答得好,罗曼!:)因为您还可以使试用资源更容易阅读。更多信息:@YassinHajaj谢谢你的链接,我今天学到了一些新的东西:)不确定关于DZone的文章-假设是错误的。您可以在块中声明任意数量的资源,并且它们都将被关闭—如您的回答所示。@BoristSpider确实可以根据需要声明多少资源。这篇文章的例子不是最佳的
public class InputStreams implements AutoCloseable {
    private final List<InputStream> streams = new ArrayList<>();

    public List<InputStream> getStreams() {
        return streams;
    }

    public void add(InputStream is) {
        streams.add(is);
    }

    @Override
    public void close() throws IOException {
        IOException firstException = null;
        for (InputStream stream : streams) {
            try {
                stream.close();
            } catch (IOException e) {
                if (firstException == null) {
                    firstException = e;
                } else {
                    firstException.addSuppressed(e);
                }
            }
        }
        if (firstException != null) {
            throw firstException;
        }
    }
}

InputStreams streams = new InputStreams();
while (moreStreams()) {
    InputStream nextStream = null;
    try {
        nextStream = getNextStream();
        streams.add(nextStream);
    } catch (IOException e) {
        // the following will close nextStream and all the earlier streams
        try (InputStreams streamsToClose = streams) {
            if (nextStream != null) {
                nextStream.close();
            }
        } finally {
            throw e;
        }
    }
}

try (
    InputStreams streamsToClose = streams;
    SequenceInputStream is = new SequenceInputStream(new IteratorEnumeration<>(streams.getStreams().iterator()));
    BufferedReader bfr = new BufferedReader(new InputStreamReader(is))
) {
    // work with bfr...
}