Skip to content

标题: Java中的Deflate/Inflate

创建: 2020-08-11 15:05 更新: 链接: https://scz.617.cn/web/202008111505.txt


/ * javac -encoding GBK -g DeflateTest.java * java DeflateTest src dst 0 * java DeflateTest dst src 1 / import java.io.; import java.util.zip.;

public class DeflateTest { private static void PrivateCopy ( InputStream is, OutputStream os ) throws Exception { int b;

    while ( ( b = is.read() ) != -1 )
    {
        os.write( b );
    }
    os.close();
    is.close();
}  /* end of PrivateCopy */

private static void DeflateFile ( String src, String dst ) throws Exception
{
    FileInputStream         fis = new FileInputStream( src );
    FileOutputStream        fos = new FileOutputStream( dst );
    /*
     * https://docs.oracle.com/javase/8/docs/api/java/util/zip/Deflater.html
     * https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/zip/Deflater.html
     *
     * https://docs.oracle.com/javase/8/docs/api/java/util/zip/DeflaterOutputStream.html
     */
    DeflaterOutputStream    dos = new DeflaterOutputStream
    (
        fos,
        /*
         * If the parameter nowrap is true then the ZLIB header and
         * checksum fields will not be used.
         */
        new Deflater( 9, false ),
        1024 * 1024
    );
    PrivateCopy( fis, dos );
}  /* end of DeflateFile */

private static void InflateFile ( String src, String dst ) throws Exception
{
    FileInputStream         fis = new FileInputStream( src );
    /*
     * https://docs.oracle.com/javase/8/docs/api/java/util/zip/Inflater.html
     * https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/zip/Inflater.html
     *
     * https://docs.oracle.com/javase/8/docs/api/java/util/zip/InflaterInputStream.html
     */
    InflaterInputStream     iis = new InflaterInputStream
    (
        fis,
        new Inflater( false ),
        1024 * 1024
    );
    FileOutputStream        fos = new FileOutputStream( dst );
    PrivateCopy( iis, fos );
}  /* end of InflateFile */

public static void main ( String[] argv ) throws Exception
{
    String  src     = argv[0];
    String  dst     = argv[1];
    int     mode    = Integer.parseInt( argv[2] );

    switch ( mode )
    {
    /*
     * 压缩
     */
    case 0 :
        DeflateFile( src, dst );
        break;
    /*
     * 解压
     */
    case 1 :
        InflateFile( src, dst );
        break;
    }
}

}

$ xxd -g 1 src 0000000: 73 63 7a 20 69 73 20 68 65 72 65 scz is here

压缩:

$ java DeflateTest src dst 0 $ echo -ne 'scz is here' | python2 -c 'import sys,zlib;sys.stdout.write(zlib.compress(sys.stdin.read(),9))' > dst $ cat src | python2 -c 'import sys,zlib;sys.stdout.write(zlib.compress(sys.stdin.read(),9))' > dst

$ xxd -g 1 dst 0000000: 78 da 2b 4e ae 52 c8 2c 56 c8 48 2d 4a 05 00 18 x.+N.R.,V.H-J... 0000010: 6d 04 11 m..

解压:

$ java DeflateTest dst src 1 $ cat dst | python2 -c 'import sys,zlib;sys.stdout.write(zlib.decompress(sys.stdin.read()))' > src $ openssl zlib -d < dst > src

$ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - dst | gzip -dc > src

gzip: stdin: unexpected end of file

有个警告,但解压无误。