GZIP在Java中序列化类中的应用,文件压缩与解压
最近,在做WEB的时候,考虑到了文件压缩的问题,结果一搜,JDK自带了Gzip类,整理了一下关于类的序列化的压缩与解压,记录下来,方便以后使用。
首先先放图,两个文件,一个没压缩,一个压缩的,体积缩小一半左右。
接下来就放代码了,论坛找的,再修改了一下:
序列化的类:
import java.io.Serializable;
import java.util.Date;
public class GzipData implements Serializable {
private static final long serialVersionUID = 1L;
public Date date;
public String name;
public String pwd;
@Override
public String toString() {
return "GzipData [date=" + date + ", name=" + name + ", pwd=" + pwd + "]";
}
}
对序列化类压缩与解压缩:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class TestGzip {
// 将Data类型数据对象序列化对象压缩,返回字节数组,压缩后的对象数组可写入文件保存或用于网络传输
public byte[] writeCompressObject(Object obj) {
byte[] data_ = null;
try {
// 建立字节数组输出流
ByteArrayOutputStream o = new ByteArrayOutputStream();
// 建立gzip压缩输出流
GZIPOutputStream gzout = new GZIPOutputStream(o);
// 建立对象序列化输出流
ObjectOutputStream out = new ObjectOutputStream(gzout);
out.writeObject(obj);
out.flush();
out.close();
gzout.close();
// 返回压缩字节流
data_ = o.toByteArray();
o.close();
} catch (IOException e) {
System.out.println(e);
}
return data_;
}
// 将压缩字节数组还原为Data类型数据对象
public Object readCompressObject(byte[] data_) {
Object obj = null;
try {
// 建立字节数组输入流
ByteArrayInputStream i = new ByteArrayInputStream(data_);
// 建立gzip解压输入流
GZIPInputStream gzin = new GZIPInputStream(i);
// 建立对象序列化输入流
ObjectInputStream in = new ObjectInputStream(gzin);
// 按制定类型还原对象
obj = (Object) in.readObject();
i.close();
gzin.close();
in.close();
} catch (ClassNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
return obj;
}
}
编写的测试方法,可以自己编写,这里只上方法,@Test
@Test
public void testGZip() throws Exception{
GzipData gd = new GzipData();
gd.date = new Date();
gd.name = "addjkfsajflkasdjfsdklajkdlasjlkdsajfdsaj卡迪夫斯基阿克拉附近阿斯科利发动机啊十分谨慎考虑的发生口角啊打开了司法局啊都快散了附近"
+ "的撒飞机啊打开了司法局考拉都是看到司法解释昆德拉分离"
+ "对方快乐的撒艰苦弗拉基斯的时间飞快的时间啊分开了就是"
+ "的撒看见立法的撒看见反抗拉萨的卷发流口水亏大发了四季度可拉斯警方"
+ "的撒反抗拉萨的卷发可拉斯的卷发可拉斯大解放拉的时间"
+ "对方卡拉就算对方快乐就打算开发累计ask法律界萨迪克"
+ "对方卡死的卷发可拉斯的卷发可拉斯大解放拉喀什的"
+ "对方卡死加拉斯的卷发可拉的时间飞快拉萨的卷发可拉斯大降"
+ "打开了飞机啊圣诞快乐附近岁的卡拉解放拉喀什大解放棵df阿斯顿附近卡桑德拉积分可拉斯的卷发可拉"
+ "东风科技界啊独守空房垃圾啊塞德里克飞机啊的撒考虑放宽东风科技啊刷卡费率"
+ "都快散了附近啊圣诞快乐附近啊圣诞快乐积分可拉斯大"
+ "的发生金卡积分可拉的时间啊卡夫卡"
+ "东风科技拉丝机可拉斯大降绿卡的时间分"
+ "的撒飞机卡的时间飞快拉萨的卷发绿卡的撒打算开飞机啊圣诞快乐附近"
+ "飞机扩大时间飞快拉萨的卷发可拉斯的分i看"
+ "萨多夫空军桑德拉积分可拉斯的卷发可拉的时间飞快拉萨的家"
+ "打开手机发送酒店客房拉萨的min";
gd.pwd = "jskdkljdaskaldsjfksadjkkfjds"
+ "dkjlsjfasdjfkasdjfkldsjfklsdajfklsdjowerirjioasl;fdjsklfjasldjfkaskfd;"
+ "kjldfjsakljqwioerejiwoqjmnfaskldfjkldasfjlkasdljfkdlaskdfjkladjkajfkls"
+ "kasfjkdlasjfkladsjfklasdjdfklwjeiorjioe2qweklafjdasklfjdijfiodsajf"
+ "wefkjfkladsjfklsdajfklasfjkldasfjklsadjfioewjerfjfalkdsajfkldsa"
+ "dsakfdasjfklasjkljfklajeriojwrioejsjmdklfjfkljasdfkjasfjasioewrioqipqipdfsiaj"
+ "ajkdfjksdafjksdal;fkldasfjadskfjewioruewureioejkldasjfdsklfjl"
+ "dsfalkjdsklafjklasjfkldsajfklasjkladfjdsildasjfkldsajfijoiw"
+ "dkflasjfklasdjklfdjsdfljadsiowjriowuiorweqjadklsfjasdkljdflasjkas"
+ "dfjkslajasdlk;jfasdl;jieowireowjrslakdfjkldasjfdklasjfdklasfjsdklafjkdls";
//Object写
ObjectOutputStream out = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream("d:/obj1.txt")));
out.writeObject(gd);
out.close();
//压缩类
TestGzip tgz = new TestGzip();
byte[] temp = tgz.writeCompressObject(gd);
//压缩的类写如文件保存
try {
File file = new File("d:/obj2.txt");
OutputStream out2 = new FileOutputStream(file);
out2.write(temp);
out2.flush();
out2.close();
} catch (IOException e) {
// TODO: handle exception
}
//读取刚刚写入的压缩的类
try {
File file = new File("d:/obj2.txt");
InputStream in = new FileInputStream(file);
byte[]b = new byte[(int)file.length()];
for(int i=0;i<b.length;i++){
b[i]=(byte)in.read();
}
in.close();//下面解压缩类,还原类
Object obj = tgz.readCompressObject(b);
gd = (GzipData)obj;//下面是测试解压缩的类能否正确输出
System.out.println(gd);
}catch(Exception e){
e.printStackTrace();
}
}
转载于:https://my.oschina.net/isiav/blog/786865