我试图从服务器获取一个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
请帮助,我的老板变得不耐烦了:哦 我不知道这个文件中的内容我必须找出:)
答案 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 );
从那里开始......