Java Zip字節(jié)數(shù)組

2018-02-05 16:55 更新

Java IO教程 - Java Zip字節(jié)數(shù)組

校驗和

Java在java.util.zip包中提供了一個Adler32類來計算數(shù)據(jù)字節(jié)的Adler-32校驗和。

我們需要調(diào)用這個類的update()方法將字節(jié)傳遞給它。

在同一個包中還有另一個名為CRC32的類,它允許您使用CRC32算法計算校驗和。

以下代碼說明如何使用Adler32和CRC32類來計算校驗和。

import java.util.zip.Adler32;
import java.util.zip.CRC32;

public class Main {
  public static void main(String[] args) throws Exception {
    String str = "HELLO";
    byte[] data = str.getBytes("UTF-8");
    System.out.println("Adler32 and  CRC32  checksums  for " + str);

    // Compute Adler32 checksum
    Adler32 ad = new Adler32();
    ad.update(data);
    long adler32Checksum = ad.getValue();
    System.out.println("Adler32: " + adler32Checksum);

    // Compute CRC32 checksum
    CRC32 crc = new CRC32();
    crc.update(data);
    long crc32Checksum = crc.getValue();
    System.out.println("CRC32: " + crc32Checksum);
  }
}

上面的代碼生成以下結(jié)果。


壓縮字節(jié)數(shù)組

我們可以使用java.util.zip包中的Deflater和Inflater類來分別壓縮和解壓縮字節(jié)數(shù)組中的數(shù)據(jù)。

我們可以使用Deflater類中的一個常量來指定壓縮級別。

這些常數(shù)是BEST_COMPRESSION,BEST_ SPEED,DEFAULT_COMPRESSION和NO_COMPRESSION。

最佳速度意味著較低的壓縮比,最好的壓縮意味著較慢的壓縮速度。

Deflater  compressor = new Deflater(Deflater.BEST_COMPRESSION);

默認(rèn)情況下,壓縮數(shù)據(jù)使用Deflater對象將以ZLIB格式。

要以GZIP或PKZIP格式壓縮數(shù)據(jù),請通過在構(gòu)造函數(shù)中使用布爾標(biāo)志為true來指定。

// Uses  the   best speed  compression and  GZIP format
Deflater  compressor = new Deflater(Deflater.BEST_SPEED, true);

以下代碼顯示如何使用Deflater和Inflater類壓縮和解壓縮字節(jié)數(shù)組

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;

public class Main {
  public static void main(String[] args) throws Exception {
    String input = "Hello world!";
    byte[] uncompressedData = input.getBytes("UTF-8");

    byte[] compressedData = compress(uncompressedData,
        Deflater.BEST_COMPRESSION, false);

    byte[] decompressedData = decompress(compressedData, false);

    String output = new String(decompressedData, "UTF-8");

    System.out.println("Uncompressed data length: " + uncompressedData.length);
    System.out.println("Compressed data length:  " + compressedData.length);
    System.out.println("Decompressed data length:  " + decompressedData.length);
  }

  public static byte[] compress(byte[] input, int compressionLevel,
      boolean GZIPFormat) throws IOException {
    Deflater compressor = new Deflater(compressionLevel, GZIPFormat);

    compressor.setInput(input);

    compressor.finish();

    ByteArrayOutputStream bao = new ByteArrayOutputStream();
    byte[] readBuffer = new byte[1024];
    int readCount = 0;

    while (!compressor.finished()) {
      readCount = compressor.deflate(readBuffer);
      if (readCount > 0) {
        bao.write(readBuffer, 0, readCount);
      }
    }

    compressor.end();
    return bao.toByteArray();
  }

  public static byte[] decompress(byte[] input, boolean GZIPFormat)
      throws IOException, DataFormatException {
    Inflater decompressor = new Inflater(GZIPFormat);
    decompressor.setInput(input);
    ByteArrayOutputStream bao = new ByteArrayOutputStream();
    byte[] readBuffer = new byte[1024];
    int readCount = 0;

    while (!decompressor.finished()) {
      readCount = decompressor.inflate(readBuffer);
      if (readCount > 0) {
        bao.write(readBuffer, 0, readCount);
      }
    }
    decompressor.end();
    return bao.toByteArray();
  }
}

上面的代碼生成以下結(jié)果。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號