一次将gzip文件读取到byte []

时间:2013-04-16 13:18:02

标签: java byte gzipinputstream

代码

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 [],而不需要额外的零。

6 个答案:

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