Android Gzip压缩和解压缩文件

   为了节省流量用到了Gzip压缩文件。

 参考此链接中的代码https://gist.github.com/ansjsun/5791394

importjava.io.ByteArrayInputStream;

 
  import java.io.ByteArrayOutputStream;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.util.zip.GZIPInputStream;
  import java.util.zip.GZIPOutputStream;
   
  public class StringZip {
  public static void main(String[] args) throws Exception {
  StringBuilder value = new StringBuilder() ;
  for (int i=0; i< 100; i++) {
  value.append("java gzip 压缩测试");
  }
  //字符串压缩为byte数组
  byte[] values = value.toString().getBytes() ;
  System.out.println("解压前大小"+values.length);
  values = compress(values) ;
  System.out.println("解压后大小"+values.length);
  //把压缩后的byte数组转为字符串
  String str = new String(values,"iso8859-1") ;
   
  //传输字符串
  System.out.println(str);
   
  //将接受到的字符串转换为byte数组
  values = str.getBytes("iso8859-1") ;
  //解压缩这个byte数组
  values = decompress(values) ;
  System.out.println(newString(values,"utf-8"));
   
  }
   
  /**
  * 数据解压缩
  *
  * @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 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();
  }
   
  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;
  }
  static final int BUFFER = 10240 ;
  /**
  * 数据压缩
  *
  * @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();
  }
   
  }

以下是我的部分代码片段 函数中压缩了一个 xml文件,

public void sendmessage2() {
    try {
       OutputStream out =  socket.getOutputStream();
        StringBuilder xml = new StringBuilder();
        xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        xml.append("<CMD ID=\"0\" Cmd=\"1\" Cla=\"17\" Name=\"js6\">");
        xml.append("<PARA Data=\"123456\" Para=\"js4\"/>\n");
        xml.append("</CMD>");

        //字符串压缩为byte数组
        byte[] values ;
        values = compress(xml.toString().getBytes("utf-8")) ;
        //传输字符串
       out.write(values);


        Message m = new Message();
        m.what = 1;
        handler.sendMessage(m);
    } catch (Exception e) {
        e.printStackTrace();
        Message m = new Message();
        m.what = 2;
        handler.sendMessage(m);
    }
}
//解压代码
public void receievmessage(){
    try{
        while(true){
            DataInputStream input = new DataInputStream(socket.getInputStream());
            byte[] buffer;
            //读取input中没有读取的字节
            buffer = new byte[input.available()];
            int len;
            if(buffer.length != 0){
                System.out.println("获取到字节");
                GZIPInputStream gzip =new GZIPInputStream(input);
                        // 读取缓冲区
                len= gzip.read(buffer);
                System.out.println("接收的长度: "+len);
                char[] tChars=new char[300];
                for(int i=0;i<len;i++)
                {   tChars[i]=(char)buffer[i];  }
                StringBuffer  tStringBuf=new StringBuffer ();
                tStringBuf.append(tChars);

                System.out.println("接收的内容是: "+ tStringBuf);
               // System.out.println("接收的长度: "+buffer);
               // String msg = new String(buffer, "utf-8");//注意转码,不然中文会乱码。
              //  Message m = new Message();
              //  m.what = 3;
              //  m.obj = msg;
                //handler.sendMessage(m);
            }
        }

    }catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        Message m = new Message();
        m.what = 2;
        handler.sendMessage(m);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值