15

バイトを aに適切に圧縮ByteArrayOutputStreamし、 aを使用してそれを読み取るにはどうすればよいByteArrayInputStreamですか? 私は次の方法を持っています:

private byte[] getZippedBytes(final String fileName, final byte[] input) throws Exception {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ZipOutputStream zipOut = new ZipOutputStream(bos);
    ZipEntry entry = new ZipEntry(fileName);
    entry.setSize(input.length);
    zipOut.putNextEntry(entry);
    zipOut.write(input, 0, input.length);
    zipOut.closeEntry();
    zipOut.close();

    //Turn right around and unzip what we just zipped
    ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(bos.toByteArray()));

    while((entry = zipIn.getNextEntry()) != null) {
        assert entry.getSize() >= 0;
    }

    return bos.toByteArray();
}

このコードを実行すると、下部のアサーションが失敗するのentry.sizeは is -1. 抽出されたエンティティが圧縮されたエンティティと一致しない理由がわかりません。

4

2 に答える 2

0

byte[]圧縮して解凍する方法は?

私は定期的に次の方法を使用して、小さくbyte[](つまり、メモリに収まるとき) 収縮/膨張 (zip/unzip) します。これは、 javadocに示されているDeflaterに基づいており、クラスを使用しDeflaterてデータを圧縮し、Inflaterクラスを使用して圧縮を解除します。

public static byte[] compress(byte[] source, int level) {
    Deflater compresser = new Deflater(level);
    compresser.setInput(source);
    compresser.finish();
    byte[] buf = new byte[1024];
    ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
    int n;
    while ((n = compresser.deflate(buf)) > 0)
        bos.write(buf, 0, n);
    compresser.end();
    return bos.toByteArray(); // You could as well return "bos" directly
}

public static byte[] uncompress(byte[] source) {
    Inflater decompresser = new Inflater();
    decompresser.setInput(source);
    byte[] buf = new byte[1024];
    ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
    try {
        int n;
        while ((n = decompresser.inflate(buf)) > 0)
            bos.write(buf, 0, n);
        return bos.toByteArray();
    } catch (DataFormatException e) {
        return null;
    } finally {
        decompresser.end();
    }
}

は必要ありませんが、必要に応じてラップをByteArrayInputStream使用できます(ただし、直接使用する方が簡単です)。InflaterInputStreamInflater

于 2017-01-01T23:27:52.753 に答える