gzip算法java实现

转自:http://snowolf.iteye.com/blog/643010

GZIP常常用在linxu环境下,是一种非常简单的压缩算法。在Java实现API中,它仅仅包含两个实现类:GZIPInputStream和GZIPOutputStream。
GZIPOutputStream类用于压缩
GZIPInputStream类用于解压缩

完整代码如下

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.zip.GZIPInputStream;

import java.util.zip.GZIPOutputStream;

/**

* GZIP工具

*

* @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>

* @since 1.0

*/

public abstract class GZipUtils {

public static final int BUFFER = 1024;

public static final String EXT = ".gz";

/**

* 数据压缩

*

* @param data

* @return

* @throws Exception

*/

public static byte[] compress(byte[] data) throws Exception {

ByteArrayInputStream bais = new ByteArrayInputStream(data);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

// 压缩

compress(bais, baos);

byte[] output = baos.toByteArray();

baos.flush();

baos.close();

bais.close();

return output;

}

/**

* 文件压缩

*

* @param file

* @throws Exception

*/

public static void compress(File file) throws Exception {

compress(file, true);

}

/**

* 文件压缩

*

* @param file

* @param delete

* 是否删除原始文件

* @throws Exception

*/

public static void compress(File file, boolean delete) throws Exception {

FileInputStream fis = new FileInputStream(file);

FileOutputStream fos = new FileOutputStream(file.getPath() + EXT);

compress(fis, fos);

fis.close();

fos.flush();

fos.close();

if (delete) {

file.delete();

}

}

/**

* 数据压缩

*

* @param is

* @param os

* @throws Exception

*/

public static void compress(InputStream is, OutputStream os)

throws Exception {

GZIPOutputStream gos = new GZIPOutputStream(os);

int count;

byte data[] = new byte[BUFFER];

while ((count = is.read(data, 0, BUFFER)) != -1) {

gos.write(data, 0, count);

}

gos.finish();

gos.flush();

gos.close();

}

/**

* 文件压缩

*

* @param path

* @throws Exception

*/

public static void compress(String path) throws Exception {

compress(path, true);

}

/**

* 文件压缩

*

* @param path

* @param delete

* 是否删除原始文件

* @throws Exception

*/

public static void compress(String path, boolean delete) throws Exception {

File file = new File(path);

compress(file, delete);

}

/**

* 数据解压缩

*

* @param data

* @return

* @throws Exception

*/

public static byte[] decompress(byte[] data) throws Exception {

ByteArrayInputStream bais = new ByteArrayInputStream(data);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

// 解压缩

decompress(bais, baos);

data = baos.toByteArray();

baos.flush();

baos.close();

bais.close();

return data;

}

/**

* 文件解压缩

*

* @param file

* @throws Exception

*/

public static void decompress(File file) throws Exception {

decompress(file, true);

}

/**

* 文件解压缩

*

* @param file

* @param delete

* 是否删除原始文件

* @throws Exception

*/

public static void decompress(File file, boolean delete) throws Exception {

FileInputStream fis = new FileInputStream(file);

FileOutputStream fos = new FileOutputStream(file.getPath().replace(EXT,

""));

decompress(fis, fos);

fis.close();

fos.flush();

fos.close();

if (delete) {

file.delete();

}

}

/**

* 数据解压缩

*

* @param is

* @param os

* @throws Exception

*/

public static void decompress(InputStream is, OutputStream os)

throws Exception {

GZIPInputStream gis = new GZIPInputStream(is);

int count;

byte data[] = new byte[BUFFER];

while ((count = gis.read(data, 0, BUFFER)) != -1) {

os.write(data, 0, count);

}

gis.close();

}

/**

* 文件解压缩

*

* @param path

* @throws Exception

*/

public static void decompress(String path) throws Exception {

decompress(path, true);

}

/**

* 文件解压缩

*

* @param path

* @param delete

* 是否删除原始文件

* @throws Exception

*/

public static void decompress(String path, boolean delete) throws Exception {

File file = new File(path);

decompress(file, delete);

}

public static void main(String[] args) throws Exception {

String mobiles = "12345678900,";

for(int i = 0; i < 100; i++){

mobiles += "12345678900,";

}

byte[] yasuoqian = mobiles.getBytes();

System.out.println("压缩前 = " + yasuoqian.length);

byte[] yasuohou = compress(yasuoqian);

System.out.println("压缩后 = " + yasuohou.length);

System.out.println("" + new String(decompress(yasuohou)));

}

}

你可能感兴趣的:(java实现)