代码
GZIPInputStream gzis= new GZIPInputStream(bais);
byte[] bBodyUnzipped= new byte[10240];
gzis.read(bBodyUnzipped);
,如何通过了解文件解压长度来优化磁盘空间使用而不创建大字节[]?
根据this answer,没有这样的方法。
想法是使用这个字节[]来调用
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
String sBodyUnzipped= decoder.decode(ByteBuffer.wrap(bBodyUnzipped)).toString();
出于这个原因,我需要一个包含所有内容的bytye [],而不需要额外的零。
答案 0 :(得分:1)
读入较小的byte
数组。
答案 1 :(得分:1)
你不能只使用Apache commons IOUtils吗?
答案 2 :(得分:0)
如果zip包含二进制信息,您可以逐字节处理
InputStream is = new BufferedInputStream(new GZIPInputStream(
new FileInputStream("zip")));
for (int b; (b = is.read()) != -1;) {
// process byte
}
如果zip是文本,则逐行处理,例如
Scanner sc = new Scanner(new GZIPInputStream(new FileInputStream("zip")));
while(sc.hasNextLine()) {
String line = sc.nextLine();
// process line
}
答案 3 :(得分:0)
我认为你想要这个:
public void gzip(String path) {
GZIPInputStream in = null;
try {
in = new GZIPInputStream(
new FileInputStream(new File(path)));
byte[] read = new byte[in.available()];
in.read(read);
System.out.println(read);
}catch (Exception e) {
System.out.println(e);
}
finally {
try {
in.close();
}catch (Exception e) {
System.out.println(e);
}
}
}
请参阅:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html了解更多信息
答案 4 :(得分:0)
我还没有找到一种方法一次阅读所有内容。另一种方法是按块阅读:
private static String unzip(GZIPInputStream gzis) {
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
byte[] bBodyUnzipped= new byte[1024];
String sBodyUnzipped= null;
int offset= 0;
int bodyLength= 0;
do {
bodyLength= gzis.read(bBodyUnzipped, offset, 1024);
sBodyUnzipped+= decoder.decode(ByteBuffer.wrap(bBodyUnzipped, 0, bodyLength)).toString();
offset+= bodyLength;
} while(bodyLength < 0);
return sBodyUnzipped;
}
答案 5 :(得分:0)
public byte[] readGZFile(File file) {
byte[] fileData = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPInputStream in = null;
try {
in = new GZIPInputStream(new FileInputStream(file));
int bufsize=1024;
byte [] buf=new byte[bufsize];
int readbytes=0;
readbytes=in.read(buf);
while(readbytes!=-1){
baos.write(buf, 0,readbytes);
readbytes=in.read(buf);
}
baos.flush();
return baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return fileData;
}