Java快速开发平台

www.fastunit.com

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  23 Posts :: 0 Stories :: 273 Comments :: 0 Trackbacks
数据传输时,有时需要将数据压缩和解压缩,本例使用GZIPOutputStream/GZIPInputStream实现。

1、使用ISO-8859-1作为中介编码,可以保证准确还原数据
2、字符编码确定时,可以在uncompress方法最后一句中显式指定编码
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

// 将一个字符串按照zip方式压缩和解压缩
public class ZipUtil {

  
// 压缩
  public static String compress(String str) throws IOException {
    
if (str == null || str.length() == 0) {
      
return str;
    }
    ByteArrayOutputStream out 
= new ByteArrayOutputStream();
    GZIPOutputStream gzip 
= new GZIPOutputStream(out);
    gzip.write(str.getBytes());
    gzip.close();
    
return out.toString("ISO-8859-1");
  }

  
// 解压缩
  public static String uncompress(String str) throws IOException {
    
if (str == null || str.length() == 0) {
      
return str;
    }
    ByteArrayOutputStream out 
= new ByteArrayOutputStream();
    ByteArrayInputStream in 
= new ByteArrayInputStream(str
        .getBytes(
"ISO-8859-1"));
    GZIPInputStream gunzip 
= new GZIPInputStream(in);
    
byte[] buffer = new byte[256];
    
int n;
    
while ((n = gunzip.read(buffer)) >= 0) {
      out.write(buffer, 
0, n);
    }
    
// toString()使用平台默认编码,也可以显式的指定如toString("GBK")
    return out.toString();
  }

  
// 测试方法
  public static void main(String[] args) throws IOException {
    System.out.println(ZipUtil.uncompress(ZipUtil.compress(
"中国China")));
  }

}
posted on 2008-04-25 12:37 FastUnit 阅读(23035) 评论(8)  编辑  收藏 所属分类: Java

Feedback

# re: 字符串的压缩和解压缩[未登录] 2008-04-25 22:01 Matthew Chen
toString()不是采用平台默认编码,而是就是unicode,而且("中国China")也是unicode,java内部字符串编码只是这种类型,对外实现读取和写入文本才是使用平台默认编码的。  回复  更多评论
  

# re: 字符串的压缩和解压缩 2008-04-25 23:51 FastUnit
@Matthew Chen
看一下ByteArrayOutputStream.toString()的源码,最终使用的编码是Converters.getDefaultEncodingName(),不同环境下编码可能不同,我的是GBK。  回复  更多评论
  

# re: 字符串的压缩和解压缩 2008-04-29 16:22 晓秋
我的输出结果是这样的.
??China
我的编辑器的系统编码是:utf-8

若指定编码时报错.GZIP is not fomat.  回复  更多评论
  

# re: 字符串的压缩和解压缩 2008-05-06 14:07 FastUnit
@晓秋
不要修改过渡编码“ISO-8859-1”;
传入字符的编码是什么,解压的时候就指定这个编码,在uncompress方法的最后一句中指定,如“return out.toString("UTF-8");”  回复  更多评论
  

# re: 字符串的压缩和解压缩[未登录] 2009-09-04 13:58 菜鸟
我想问问,为什么压缩后的字符串怎么更长了?
System.out.println("中国China".length());
System.out.println(ZipUtil.compress("中国China").length());
未压缩前卫7,压缩后为29,怎么回事?  回复  更多评论
  

# re: 字符串的压缩和解压缩[未登录] 2009-10-20 18:06 菜菜鸟
@菜鸟
字符串超过一定长度时,压缩才有效!  回复  更多评论
  

# re: 字符串的压缩和解压缩[未登录] 2012-04-20 14:17 yy
gzip.write(str.getBytes());

return out.toString();

此两处建议默认加上相应的字符集编码,以在不同平台的不同默认字符集下的压缩和解压缩结果完全相同和正确。  回复  更多评论
  

# re: 字符串的压缩和解压缩 2016-01-30 19:49 www我
lz,InputStream为什么输出却是GZIPInputStream型,这也导致数据流错误,有办法解决吗?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: