从InputStream解压缩文件并返回另一个InputStream


问题内容

我正在尝试编写一个函数,该函数接受InputStream带压缩文件的数据,并返回另一个InputStream带解压缩数据的数据。

压缩文件将只包含一个文件,因此不需要创建目录等。

我试着看了看ZipInputStream其他人,但是我对Java中这么多不同类型的流感到困惑。


问题答案:

概念

GZIPInputStream用于压缩为gzip(扩展名为“
.gz”)的流(或文件)。它没有任何标题信息。

此类实现流过滤器,以读取GZIP文件格式的压缩数据

如果您有一个真正的zip文件,则必须使用ZipFile打开该文件,要求提供文件列表(示例中为其中一个),并要求提供解压缩的输入流。

如果有文件,您的方法将类似于:

// ITS PSEUDOCODE!!

private InputStream extractOnlyFile(String path) {
   ZipFile zf = new ZipFile(path);
   Enumeration e = zf.entries();
   ZipEntry entry = (ZipEntry) e.nextElement(); // your only file
   return zf.getInputStream(entry);
}

读取具有.zip文件内容的InputStream

好的,如果您有InputStream,则可以使用(如@cletus所说)ZipInputStream。它读取包含头数据的流。

ZipInputStream用于具有[标题信息+ zippeddata]的流

重要提示:如果您的PC中有文件,则可以使用ZipFileclass随机访问它

这是通过InputStream读取zip文件的示例:

import java.io.FileInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;


public class Main {
    public static void main(String[] args) throws Exception
    {
        FileInputStream fis = new FileInputStream("c:/inas400.zip");

        // this is where you start, with an InputStream containing the bytes from the zip file
        ZipInputStream zis = new ZipInputStream(fis);
        ZipEntry entry;
            // while there are entries I process them
        while ((entry = zis.getNextEntry()) != null)
        {
            System.out.println("entry: " + entry.getName() + ", " + entry.getSize());
                    // consume all the data from this entry
            while (zis.available() > 0)
                zis.read();
                    // I could close the entry, but getNextEntry does it automatically
                    // zis.closeEntry()
        }
    }
}