Java Zip字节数组
Java在java.util.zip
包中提供了一个Adler-32
类来计算数据字节的Adler-32
校验和。需要调用这个类的update()
方法将字节传递给它。
在同一个包中还有另一个名为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)
}
}
上面的代码生成以下结果。
Adler32 and CRC32 checksums for HELLO
Adler32: 72089973
CRC32: 3242484790
压缩字节数组
可以使用java.util.zip
包中的Deflater
和Inflater
类来分别压缩和解压缩字节数组中的数据。
可以使用Deflater
类中的一个常量来指定压缩级别。这些常数是BEST_COMPRESSION
,BEST_SPEED
,DEFAULT_COMPRESSION
和 NO_COMPRESSION
。
最快速度意味着较低的压缩比,最好的压缩意味着较慢的压缩速度。
Deflater compressor = new Deflater(Deflater.BEST_COMPRESSION)
默认情况下,使用Deflater
对象的压缩数据将采用ZLIB
格式。要以GZIP
或PKZIP
格式压缩数据,请通过在构造函数中使用布尔标志为true
来指定。
// Uses the best speed compression and GZIP format
Deflater compressor = new Deflater(Deflater.BEST_SPEED, true)
以下代码显示如何使用Deflater
和Inflater
类压缩和解压缩字节数组。
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()
}
}
执行上面的代码,得到以下结果 -
Uncompressed data length: 12
Compressed data length: 20
Decompressed data length: 12