检测流是否在 Java 中压缩的最佳方式
2022-09-01 19:44:06
找出我包含压缩数据的最佳方法是什么?java.io.InputStream
介绍
由于所有的答案都是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;
}