【问题标题】:How to get an InputStream representing one file in a ZipInputStream如何获取表示 ZipInputStream 中一个文件的 InputStream
【发布时间】:2021-09-28 21:34:31
【问题描述】:

我有以下情况:

我收到一个以字节数组形式通过网络发送的 Zip 文件。我不想在本地保存该文件,而是以该存档中的单个文件为目标并将其作为 InputStream 导入我的解决方案。

到目前为止,我已经设法识别出正确的 ZipEntry。但是,从这里开始,所有的 Zip 教程都会通过文件名读取条目,这在我的情况下自然不起作用,因为 zip 文件在本地不存在。

private void InputStream getReqifInputStreamFrom(byte[] reqifzFileBytes){
    ByteArrayInputStream inputStream = new ByteArrayInputStream(reqifzFileBytes);
    ZipInputStream zipInputStream = new ZipInputStream(inputStream);
    ZipEntry zipEntry = zipInputStream.getNextEntry();

    while (zipEntry != null) {
        String fileName = zipEntry.getName();
        if (fileName.endsWith(REQIF_FILE_SUFFIX)) {
            return ???;
        }
        zipEntry = zipInputStream.getNextEntry();
    }
}

那么,此时我能做些什么来返回一个 InputStream,该 InputStream 恰好代表 ZipEntry 在那个时候代表的一个文件?我考虑过只返回 zipInputStream,但由于我不确切知道它是如何工作的,我担心这样做还会包括在该文件返回之后仍在流中的所有文件。

【问题讨论】:

    标签: java zip inputstream


    【解决方案1】:

    你几乎就在那里。试试

        private InputStream getReqifInputStreamFrom(byte[] reqifzFileBytes) throws IOException {
            InputStream result = null;
            ByteArrayInputStream inputStream = new ByteArrayInputStream(reqifzFileBytes);
            ZipInputStream zipInputStream = new ZipInputStream(inputStream);
            ZipEntry zipEntry = zipInputStream.getNextEntry();
    
            while (zipEntry != null) {
                String fileName = zipEntry.getName();
                if (fileName.endsWith(REQIF_FILE_SUFFIX)) {
                    result = zipInputStream;
                    break;
                }
                zipEntry = zipInputStream.getNextEntry();
            }
            return result;
        }
    

    【讨论】:

    • 但是那不是有返回的流可能还有额外文件的问题吗?例如,我正在搜索的文件是存档中三个文件中的第二个,返回的流不会同时包含第二个和第三个文件,或者这是如何工作的?
    • 这肯定是个问题,但我认为既然你这样做了,你就在找一个。你不能让一个方法返回不止一次;)如果有多个条目,你需要完全重新考虑。想到的第一件事:在那里阅读它们,然后可能返回List<byte[]>
    • 不,我只是在寻找一个条目。我想我只是对流在这里的工作方式感到困惑。假设您有一个包含三个文件 A、B 和 C 的 ZipInputStream,因此我将其表示为 Stream[A,B,C]。我实际上想要文件 B。按照我的理解,流在 getNextEntry 处向前移动一个索引,所以当它位于 B 时,它看起来像 Stream[B,C]。如果我此时返回它,那么我实际上不是返回 Stream[B,C] 吗?因为我希望这个函数返回的只是 Stream[B]。还是我自动使用流的任何东西都只需要 1. 进入?
    • > 或者是我自动使用流的任何东西只需要 1. entr?
    猜你喜欢
    • 2011-12-12
    • 2012-07-01
    • 2018-08-22
    • 2015-06-13
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2013-11-30
    相关资源
    最近更新 更多