如何从InputStream解压缩文件

时间:2015-08-19 10:22:52

标签: java android zip unzip

我试图从服务器获取一个zip文件。 我使用HttpURLConnection获取InputStream,这就是我所拥有的:

myInputStream.toString().getBytes().toString()  is equal to [B@4.....

byte[] bytes = Base64.decode(myInputStream.toString(), Base64.DEFAULT);
String string = new String(bytes, "UTF-8");
string == �&ܢ��z�m����y....

我真的试图解压缩这个文件,但没有任何效果,还有很多问题,我应该使用GZIPInputStream还是ZipInputStream?我是否必须将此流保存为文件,或者我可以使用InputStream

请帮助,我的老板变得不耐烦了:哦 我不知道这个文件中的内容我必须找出:)

3 个答案:

答案 0 :(得分:0)

GZipInputStream和ZipInputStream是两种不同的格式。 https://en.wikipedia.org/wiki/Gzip

直接从流中检索字符串不是一个好主意。从InputStream中,可以创建一个File并使用FileOutputStream将数据写入其中。

在Base 64中解码是另一回事。如果您的流已经在上游解码了格式,就可以了;否则,您必须使用另一个解码Base64格式的输入流来封装流。 最佳做法是使用缓冲区以避免内存溢出。

以下是一些Kotlin代码,可将压缩后的InputStream解压缩到文件中。 (比java简单,因为字节[]的管理很乏味):

JSON.parse()

如果要从服务器获取文件而不进行解压缩,请删除ZipInputStream()装饰器。

答案 1 :(得分:-1)

基本上将inputStream设置为GZIPInputStream应该能够读取实际内容。 同样为了简单起见,使用IOUtils中的apache.commons包让您的生活变得轻松

这对我有用:

    InputStream is ; //initialize you IS
    is = new GZIPInputStream(is);
    byte[] bytes = IOUtils.toByteArray(is);
    String s = new String(bytes);
    System.out.println(s);

答案 2 :(得分:-1)

通常,GZIPInputStream或ZipInputStream之间没有显着差异,所以如果两者都应该有效。

接下来,您需要确定压缩流是否为Base64编码,或者将一些Base64编码的内容放入压缩流中 - 从您提出的问题来看,它似乎是后一种选择。

所以你应该试试

ZipInputStream zis = new ZipInputStream( myInputStream );
ZipEntry ze = zis.getNextEntry();
InputStream is = zis.getInputStream( ze );

从那里开始......