使用SequenceInputStream时逐行读取多个文件时出现问题

时间:2015-10-18 02:55:28

标签: java inputstream

我正在逐行阅读多个文件,并找到了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合并为一个)

3 个答案:

答案 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)));