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

Java 使用SequenceInputStream时逐行读取多个文件时出现问题,java,inputstream,Java,Inputstream,我正在逐行阅读多个文件,发现SequenceInputStream很方便。以下是我如何使用它: try ( InputStream in = new SequenceInputStream(new FileInputStream(file1),new FileInputStream(file2)); Scanner reader = new Scanner(source)) { while ( reader.hasNext ()) { System.out

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

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实现,以检查文件的最后一行是否有换行符,如果没有,则插入一个作为
read()的一部分
方法。

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实现,以检查文件的最后一行是否有换行符,如果没有,则插入一个作为
read()的一部分
方法。

如果要对多个流进行排序,并希望确保每个流的结尾都在a中,则将每个流包装在a中,如果不在过滤流中,则在结尾处返回一个额外的行分隔符。

如果要对多个流进行排序,并希望确保每个流的结尾都在a中,将每个流包装在一个结尾处返回一个额外的行分隔符的容器中,如果不是在过滤流中。

正如其他答案所指出的,我可以创建自己的
SequenceInputStream
实现,或者将每个流包装到
FilterInputStream
中。然而,我认为我找到了一个更简单的解决方案:只需在我的文件流之间插入提供端点的流

InputStream in = new SequenceInputStream(
    new FileInputStream(file1),
    new SequenceInputStream(
        new ByteArrayInputStream("\n".getBytes()), // gives an endline between the provided files
        new FileInputStream(file2)));

正如其他答案所指出的,我可以创建自己的
SequenceInputStream
实现,或者将每个流包装到
FilterInputStream
中。然而,我认为我找到了一个更简单的解决方案:只需在我的文件流之间插入提供端点的流

InputStream in = new SequenceInputStream(
    new FileInputStream(file1),
    new SequenceInputStream(
        new ByteArrayInputStream("\n".getBytes()), // gives an endline between the provided files
        new FileInputStream(file2)));

也许
file1
不会以换行符结尾。@JamesKPolk这是一个黑客。它会“起作用”,但一般来说,您会为即将阅读的输入文件编写换行符吗?那太疯狂了没有新线为什么你会期望有一条单独的线?当一个文件源为单个输入流时,扫描仪如何知道一个文件何时结束,下一个文件何时开始?这不是重点。我读了好几份文件,我希望得到他们的台词,我认为这是合理的。这是不合理的,因为这是不可能的。扫描器怎么可能知道一个文件的结束和下一个文件的开始?根据定义,SequenceInputStream接受多个文件,并将它们简单地连接起来形成一个输入流,然后将其传递给Scanner实例。也许
file1
不会以换行结束。@JamesKPolk这是一个错误。它会“起作用”,但一般来说,您会为即将阅读的输入文件编写换行符吗?那太疯狂了没有新线为什么你会期望有一条单独的线?当一个文件源为单个输入流时,扫描仪如何知道一个文件何时结束,下一个文件何时开始?这不是重点。我读了好几份文件,我希望得到他们的台词,我认为这是合理的。这是不合理的,因为这是不可能的。扫描器怎么可能知道一个文件的结束和下一个文件的开始?根据定义,SequenceInputStream接受多个文件,并将它们简单地连接起来形成一个inputstream,然后将其传递给Scanner实例。是否添加示例?是否添加示例?在这种情况下可以,但如果文件已以换行结束,则此解决方案将为您提供额外的空行。嗯,额外的空行没有那么糟糕,我可以接受。在这种情况下,这会起作用,但如果文件已经以换行结束,此解决方案将为您提供额外的空行。嗯,额外的空行没有那么糟糕,我可以接受它。