Java 一次将gzip文件全部读取到字节[]
编码 ,如何优化磁盘空间使用,而不通过知道文件解压缩长度来创建大字节[] 据了解,目前还没有这样的方法 其思想是使用这个字节[]来调用Java 一次将gzip文件全部读取到字节[],java,byte,gzipinputstream,Java,Byte,Gzipinputstream,编码 ,如何优化磁盘空间使用,而不通过知道文件解压缩长度来创建大字节[] 据了解,目前还没有这样的方法 其思想是使用这个字节[]来调用 GZIPInputStream gzis= new GZIPInputStream(bais); byte[] bBodyUnzipped= new byte[10240]; gzis.read(bBodyUnzipped); 因此,我需要一个bytye[],包含所有内容,没有多余的零。读入一个更小的字节数组。你不能只使用Apache commons IOUt
GZIPInputStream gzis= new GZIPInputStream(bais);
byte[] bBodyUnzipped= new byte[10240];
gzis.read(bBodyUnzipped);
因此,我需要一个bytye[],包含所有内容,没有多余的零。读入一个更小的
字节数组。你不能只使用Apache commons IOUtils吗?如果zip包含二进制信息,你可以逐字节处理它
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
String sBodyUnzipped= decoder.decode(ByteBuffer.wrap(bBodyUnzipped)).toString();
如果zip是文本,则逐行处理它,例如
InputStream is = new BufferedInputStream(new GZIPInputStream(
new FileInputStream("zip")));
for (int b; (b = is.read()) != -1;) {
// process byte
}
我想你想要这个:
Scanner sc = new Scanner(new GZIPInputStream(new FileInputStream("zip")));
while(sc.hasNextLine()) {
String line = sc.nextLine();
// process line
}
请参阅:有关更多信息,我没有找到一种同时阅读所有内容的方法。另一种方法是按块读取:
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);
}
}
}
private静态字符串解压(gzip输入流gzis){
CharsetDecoder decoder=Charset.forName(“UTF-8”).newDecoder();
字节[]bBodyUnzipped=新字节[1024];
字符串sBodyUnzipped=null;
整数偏移=0;
int bodyLength=0;
做{
bodyLength=gzis.read(bBodyUnzipped,偏移量1024);
sBodyUnzipped+=decoder.decode(ByteBuffer.wrap(bBodyUnzipped,0,bodyLength)).toString();
偏移量+=车身长度;
}体长<0;
返回sBodyUnzipped;
}
我通常使用1024或2048的缓冲区是的,这是a想要的。但InflaterInputStream类重写了in.available中的方法,该类只返回0或1.ok。我总是使用这种方法,因为我认为它与用于fileInputStream的方法相同。谢谢你的建议。也许我们可以使用一个循环来解决这个问题,因为in.read给了我们一些有用的信息。我会试试的,如果你已经找到了一个解决方法,请告诉我,我可以用哪种方法?谢谢。toByteArray(InputStream输入)
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;
}
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;
}