2

在代码中

GZIPInputStream gzis= new GZIPInputStream(bais);
byte[] bBodyUnzipped= new byte[10240];
gzis.read(bBodyUnzipped);

,如何通过知道文件解压缩长度来优化磁盘空间使用而不创建大字节[]?

根据这个答案,没有这种方法。

这个想法是使用这个 byte[] 来调用

CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
String sBodyUnzipped= decoder.decode(ByteBuffer.wrap(bBodyUnzipped)).toString();

出于这个原因,我需要一个包含所有内容且没有额外零的字节 []。

4

6 回答 6

1

你不能只使用 Apache commons IOUtils 吗?

于 2013-04-16T13:28:50.493 回答
1

读入一个较小的byte数组。

于 2013-04-16T13:22:48.287 回答
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;
}
于 2014-12-28T10:31:39.883 回答
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

于 2013-04-17T14:52:41.253 回答
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;
}
于 2013-04-18T07:45:45.390 回答
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
    }
于 2013-04-16T13:31:00.033 回答