package com.gh.common.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class GzipUtils {

	private final static int BUFFER = 1024;

	/*
	 * 数据压缩
	 */
	public static void compress(InputStream is, OutputStream os) throws IOException {
		GZIPOutputStream gos = null;
		try {
			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.flush();
			gos.finish();
			gos.close();
		} finally {
			if (gos != null) {
				gos.close();
			}
		}
	}

	/*
	 * 数据解压缩
	 */
	public static void decompress(InputStream is, OutputStream os) throws IOException {
		GZIPInputStream gis = null;
		try {
			gis = new GZIPInputStream(is);
			int count;
			byte data[] = new byte[BUFFER];
			while ((count = gis.read(data, 0, BUFFER)) != -1) {
				os.write(data, 0, count);
			}
		} finally {
			if (gis != null) {
				gis.close();
			}
		}
	}

	public static byte[] compressBytes(byte[] compressed) {
		ByteArrayInputStream bais = null;
		ByteArrayOutputStream baos = null;
		try {
			bais = new ByteArrayInputStream(compressed);
			baos = new ByteArrayOutputStream();
			compress(bais, baos);
			return baos.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
			return compressed;
		} finally {
			if (bais != null) {
				try {
					bais.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (baos != null) {
				try {
					baos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static byte[] decompressBytes(byte[] compressed) {
		ByteArrayInputStream bais = null;
		ByteArrayOutputStream baos = null;
		try {
			bais = new ByteArrayInputStream(compressed);
			baos = new ByteArrayOutputStream();
			decompress(bais, baos);
			return baos.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
			return compressed;
		} finally {
			if (bais != null) {
				try {
					bais.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (baos != null) {
				try {
					baos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
