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;
}