如何在java中的大文件上使用Deflater和Inflater?

时间:2018-04-28 15:24:10

标签: java deflate inflate lossless-compression

我想使用DeflaterInflater(非DeflaterOutputStreamInflaterInputStream)来压缩文件。问题是在这种情况下提到的缓冲区大小为1024后,deflater停止工作。我使用以下代码:

public class CompressionUtils {

    static String deflateInput = "pic.jpg";
    static String deflateOutput = "picDeflate.raw";
    static String inflateOutput = "picInflate.jpg";

    public static void compress() throws IOException {
        Deflater deflater = new Deflater();
        byte[] data = new byte[1024];
        FileInputStream in = new FileInputStream(new File(deflateInput));
        FileOutputStream out = new FileOutputStream(new File(deflateOutput));

        long readBytes = 0;
        while ((readBytes = in.read(data, 0, 1024)) != -1) {
            deflater.setInput(data);
            deflater.finish();
            byte[] buffer = new byte[1024];
            while (!deflater.finished()) {
                int count = deflater.deflate(buffer); // returns the generated code... index  
                out.write(buffer, 0, count);
            }
        }
    }

    public static void decompress() throws IOException, DataFormatException {
        Inflater inflater = new Inflater();
        byte[] data = new byte[1024];
        FileInputStream in = new FileInputStream(new File(deflateOutput));
        FileOutputStream out = new FileOutputStream(new File(inflateOutput));
        long readBytesCount = 0;
        long readCompressedBytesCount = 0;
        long readBytes = 0;
        while ((readBytes = in.read(data, 0, 1024)) != -1) {
            readBytesCount = readBytesCount + readBytes;
            inflater.setInput(data);
            byte[] buffer = new byte[1024];
            while (!inflater.finished()) {
                int count = inflater.inflate(buffer);
                System.out.println("Remaining: " + inflater.getRemaining());
                out.write(buffer, 0, count);
            }
        }
        System.out.println("readBytesCount: " + readBytesCount);
    }

    public static void main(String[] args) {
        System.out.println("Operation started");
        try {
            compress();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("Operation ended");

    }
}

这是dir的输出(在窗口中):

01-04-2018  16:52           220,173 pic.jpg
28-04-2018  20:50               943 picDeflate.raw
28-04-2018  20:28             1,024 picInflate.jpg

为什么压缩代码在读取1024个字节后停止?

1 个答案:

答案 0 :(得分:0)

finish()仅适用于您完成的时间。在将所有输入数据提供给对象后,这是最后一个调用。