我正在尝试编写一个函数,该函数接受带有压缩文件数据的InputStream
,并返回另一个带有解压缩数据的InputStream
。
压缩文件只包含一个文件,因此不需要创建目录等......
我试着看ZipInputStream
和其他人,但我对Java中的这么多不同类型的流感到困惑。
答案 0 :(得分:45)
<强>概念强>
GZipinputstream用于以gzip(“.gz”扩展名)划分的流(或文件)。它没有任何标题信息。
GZipInputStream is for [zippeddata]
如果您有一个真正的zip文件,您必须使用ZipFile打开该文件,询问文件列表(在您的示例中为一个)并请求解压缩的输入流。
ZipFile is for a file with [header information + zippeddata]
如果您有该文件,您的方法将类似于:
// 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 is for a stream with [header information + zippeddata]
重要提示:如果您的PC中有该文件,则可以使用ZipFile
课程随机访问该文件
这是通过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()
}
}
}
答案 1 :(得分:6)
如果您可以更改输入数据,我建议您使用GZIPInputStream
。
GZipInputStream
与ZipInputStream
不同,因为您内部只有一个数据。所以整个输入流代表整个文件。在ZipInputStream
中,整个流也包含其中的文件结构,可以是很多。
答案 2 :(得分:4)
它采用scala语法:
def unzipByteArray(input: Array[Byte]): String = {
val zipInputStream = new ZipInputStream(new ByteArrayInputStream(input))
val entry = zipInputStream.getNextEntry
IOUtils.toString(zipInputStream, StandardCharsets.UTF_8)
}
答案 3 :(得分:2)
除非我遗漏了某些东西,否则你绝对应该尝试让ZipInputStream
工作,而且没有理由不这样做(我肯定曾多次使用它)。
您应该尝试让ZipInputStream
工作,如果您不能,请发布代码,我们将帮助您解决您遇到的任何问题。
无论你做什么,都不要试图重新发明它的功能。