我正在逐行阅读多个文件,并找到了SequenceInputStream
方便。这是我如何使用它:
try (
InputStream in = new SequenceInputStream(new FileInputStream(file1),new FileInputStream(file2));
Scanner reader = new Scanner(source)) {
while ( reader.hasNext ()) {
System.out.println(reader.nextLine());
}
}
然而,它有一个特殊的问题。让我们说:
File1
a
b
文件2
c
d
然后执行的代码将输出:
a
bc
d
似乎它没有区分不同文件的行,有没有办法解决这个问题? (是的,我真的需要将多个InputStream合并为一个)
答案 0 :(得分:2)
SequenceInputStream
隐藏了除最后一个文件以外的所有包装文件中的EOF
个字符:
public int read() throws IOException {
if (in == null) {
return -1;
}
int c = in.read();
if (c == -1) {
nextStream();
return read();
}
return c;
}
因此,如果文件不以新行结束,则file2的第一行将附加到file1的最后一行。
如果你真的需要使用单个inputStream并且你需要有单独的行来分隔每个文件,你可能必须编写自己的InputStream实现来检查是否有换行符作为文件的最后一行,如果不,将{1}作为read()
方法的一部分插入。
答案 1 :(得分:1)
如果您要对多个流进行排序并希望确保line separator中的每一个结束,请将每个流包装在FilterInputStream
中,如果不在过滤流中,则在最后返回一个额外的行分隔符
答案 2 :(得分:1)
正如其他答案所指出的,我可以创建自己的SequenceInputStream
实现,或将每个流包装到FilterInputStream
。但是我认为我找到了一个更简单的解决方案:只需插入在我的文件流之间提供 endline 的流。
InputStream in = new SequenceInputStream(
new FileInputStream(file1),
new SequenceInputStream(
new ByteArrayInputStream("\n".getBytes()), // gives an endline between the provided files
new FileInputStream(file2)));