包含两个文件的单个输入流。我想分割这些文件

时间:2011-03-14 13:16:22

标签: java inputstream

在java中,我有inputstream(可能sequenceinputstream)包含多个文件。我想用java分隔这些文件。 java中有没有可用的解决方案?

3 个答案:

答案 0 :(得分:0)

简单的答案是:你不能/不应该。

复杂的答案:如果您正在处理SequenceInputStream,您可以使用此反射黑客访问基础流:

@SuppressWarnings("unchecked")
public static Enumeration<InputStream> split(final SequenceInputStream sis){
    try{
        Field streamsEnumField =
            SequenceInputStream.class.getDeclaredField("e");
        streamsEnumField.setAccessible(true);
        return (Enumeration<InputStream>) streamsEnumField.get(sis);
    } catch(final Exception e){
        throw new IllegalStateException(e);
    }
}

但我会非常谨慎地使用这样的东西。

答案 1 :(得分:0)

这取决于你有什么样的文件,如果有任何保留的序列指示文件的结束和/或开头,如HTML或XML等,那么你可以将它们分开,否则我看不到任何文件这样做的方法。

答案 2 :(得分:0)

您需要有一些方法来确定一个文件的结束位置和下一个文件的开头 - 大多数文件将前几个字节保留为“标识”标记。请记住,Java坚持使用SIGNED字节类可能会在运行时识别它们。

但是,你无法真正拆分流。因此,您必须通过普通的byte []数组来暂存数据。我从家庭流中读取4K(用于文件)或64K(用于网络)的块,因为底层本机调用通常使用这些大小,将块存储在列表中,然后为每个文件创建一个ByteArrayInputStream