检测流是否在 Java 中压缩的最佳方式

2022-09-01 19:44:06

找出我包含压缩数据的最佳方法是什么?java.io.InputStream


答案 1

介绍

由于所有的答案都是5年前的,我觉得有责任写下今天发生的事情。我严重怀疑人们应该阅读流的魔术字节!这是一个低级代码,通常应该避免。

简单的答案

miku 写道:

如果可以通过 ZipInputStream 读取流,则应将其压缩。

是的,但是在“可以读取”的情况下意味着第一次调用返回一个非空值。没有例外捕捉等等。因此,您可以执行以下操作,而不是神奇的字节解析:ZipInputStream.getNextEntry()

boolean isZipped = new ZipInputStream(yourInputStream).getNextEntry() != null;

就是这样!

一般解压缩思路

通常,在[取消]压缩时处理文件似乎比使用流更方便。有几个有用的库,加上ZipFile比ZipInputStream具有更多的功能。这里讨论zip文件的处理:什么是一个好的Java库来压缩/解压缩文件?因此,如果您可以使用文件,则最好这样做!

代码示例

我的应用程序中只需要使用流。这就是我为解压缩而编写的方法:

import org.apache.commons.io.IOUtils;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public boolean unzip(InputStream inputStream, File outputFolder) throws IOException {

    ZipInputStream zis = new ZipInputStream(inputStream);

    ZipEntry entry;
    boolean isEmpty = true;
    while ((entry = zis.getNextEntry()) != null) {
        isEmpty = false;
        File newFile = new File(outputFolder, entry.getName());
        if (newFile.getParentFile().mkdirs() && !entry.isDirectory()) {
            FileOutputStream fos = new FileOutputStream(newFile);
            IOUtils.copy(zis, fos);
            IOUtils.closeQuietly(fos);
        }
    }

    IOUtils.closeQuietly(zis);
    return !isEmpty;
}

答案 2

ZIP 格式的魔术字节是 。您可以测试流(使用标记重置 - 您可能需要缓冲),但我不希望这是一种100%可靠的方法。无法将其与以字母开头的US-ASCII编码文本文件区分开来。50 4BPK

最好的方法是在打开流之前提供有关内容格式的元数据,然后对其进行适当的处理。


推荐