查阅了下资料,总结下面的代码:
[coolcode lang="java"]
/**
* 压缩字符串为 byte[]
* 储存可以使用new sun.misc.BASE64Encoder().encodeBuffer(byte[] b)方法
* 保存为字符串
*
* @param str 压缩前的文本
* @return
*/
public static final byte[] compress(String str) {
if(str == null)
return null;
byte[] compressed;
ByteArrayOutputStream out = null;
ZipOutputStream zout = null;
try {
out = new ByteArrayOutputStream();
zout = new ZipOutputStream(out);
zout.putNextEntry(new ZipEntry("0"));
zout.write(str.getBytes());
zout.closeEntry();
compressed = out.toByteArray();
} catch(IOException e) {
compressed = null;
} finally {
if(zout != null) {
try{zout.close();} catch(IOException e){}
}
if(out != null) {
try{out.close();} catch(IOException e){}
}
}
return compressed;
}
/**
* 将压缩后的 byte[] 数据解压缩
*
* @param compressed 压缩后的 byte[] 数据
* @return 解压后的字符串
*/
public static final String decompress(byte[] compressed) {
if(compressed == null)
return null;
ByteArrayOutputStream out = null;
ByteArrayInputStream in = null;
ZipInputStream zin = null;
String decompressed;
try {
out = new ByteArrayOutputStream();
in = new ByteArrayInputStream(compressed);
zin = new ZipInputStream(in);
ZipEntry entry = zin.getNextEntry();
byte[] buffer = new byte[1024];
int offset = -1;
while((offset = zin.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString();
} catch (IOException e) {
decompressed = null;
} finally {
if(zin != null) {
try {zin.close();} catch(IOException e) {}
}
if(in != null) {
try {in.close();} catch(IOException e) {}
}
if(out != null) {
try {out.close();} catch(IOException e) {}
}
}
return decompressed;
}
[/coolcode]
这里需要特别注意的是,如果你想把压缩后的byte[]保存到字符串中,不能直接使用new String(byte)或者byte.toString(),因为这样转换之后容量是增加的。同样的道理,如果是字符串的话,也不能直接使用new String().getBytes()获取byte[]传入到decompress中进行解压缩。
如果保存压缩后的二进制,可以使用new sun.misc.BASE64Encoder().encodeBuffer(byte[] b)将其转换为字符串。同样解压缩的时候首先使用new BASE64Decoder().decodeBuffer 方法将字符串转换为字节,然后解压就可以了。
关于使用 java.util.zip 操作文件和目录,请参考这里:http://www.baidu.com/s?wd=java.util.zip&cl=3
参考资料:
Simple String Compression Functions
http://forum.java.sun.com/thread.jspa?threadID=250124&start=15&tstart=0
使用cookie定制用户UI
http://www.phpx.com/happy/thread-113016-1-24.html
zout.write(str.getBytes());
这行代码在不同平台使用时依赖于所在平台的默认字符集,因此在不同的默认字符集平台下将会产生不同的压缩效果(即:压缩结果错误)。
谢谢你的提醒,这里可以增加一个让用户指定字符集的选项,如果不指定的话就使用默认字符集。