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...
}