android客户端使用网络数据压缩

GZIPInputStream

面试遇到了网络数据压缩的问题,本来问道这个问题前我也看过Gzip,不是很理解,龙哥提示要把网络两个字去掉就有思路了,再次提示下我才看到gzip方式。

Gzip也是android客户端支持的方式,官网解释:GZIPInputStream此类是用来读取GZIP格式存储数据底层的流它的缓冲区读取和解压GZIP数据

 InputStream is = ...
 
GZIPInputStream zis = new GZIPInputStream(new BufferedInputStream(is));
 
try {
     
// Reading from 'zis' gets you the uncompressed bytes...
     processStream
(zis);
 
} finally {
     zis
.close();
 
}

比较实际的配置说明http://www.blogjava.net/site120/archive/2007/02/16/100073.html

servlet的作法

  1. 1, 工具类:测试客户端是否支持GZIP编码压缩方式 & 获得支持GZIP的PrintWriter对象  
  2.   
  3. package freebsd;  
  4.   
  5. import java.io.IOException;  
  6. import java.io.PrintWriter;  
  7. import java.util.zip.GZIPOutputStream;  
  8.   
  9. import javax.servlet.ServletOutputStream;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13.   
  14. public class Utilities {  
  15. /* 
  16. * 测试客户端浏览器是否支持gzip的编码方式 
  17. */  
  18. public static boolean isSurpported(HttpServletRequest request)  
  19. {  
  20.    String encodingString = request.getHeader("Accept-Encoding");  
  21.    return (encodingString!=null) && (encodingString.indexOf("gzip")!=-1);  
  22. }  
  23. /* 
  24. * 取得一个压缩的PrintWriter 
  25. */  
  26. public static PrintWriter getWriter(HttpServletResponse response) throws IOException  
  27. {  
  28.    ServletOutputStream sos = response.getOutputStream();  
  29.    GZIPOutputStream gzipos = new GZIPOutputStream(sos);  
  30.    return new PrintWriter(gzipos);  
  31. }  
  32.   
  33. }  
  34. 2,Servlet类,产生一个长字符串,然后在html页面中请求该servlet:  
  35.   
  36. import freebsd.*;  
  37.   
  38. import java.io.IOException;  
  39. import java.io.PrintWriter;  
  40.   
  41. import javax.servlet.ServletException;  
  42. import javax.servlet.http.HttpServlet;  
  43. import javax.servlet.http.HttpServletRequest;  
  44. import javax.servlet.http.HttpServletResponse;  
  45.   
  46. /** 
  47. * Servlet implementation class ServletGzip 
  48. */  
  49. public class ServletGzip extends HttpServlet {  
  50. private static final long serialVersionUID = 1L;  
  51.          
  52.     /** 
  53.      * @see HttpServlet#HttpServlet() 
  54.      */  
  55.     public ServletGzip() {  
  56.         super();  
  57.         // TODO Auto-generated constructor stub  
  58.     }  
  59.   
  60. /** 
  61. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
  62. */  
  63. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  64.    doPost(request, response);  
  65. }  
  66.   
  67. /** 
  68. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
  69. */  
  70. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  71.    response.setContentType("text/html");  
  72.    response.setStatus(response.SC_OK);  
  73.    PrintWriter out;  
  74.    if(Utilities.isSurpported(request))  
  75.    {  
  76.     out = Utilities.getWriter(response);  
  77.   
  78.    //协议: 通知客户端使用gzip这种压缩方式而不是其它的,如compress  
  79.    response.setHeader("Content-Encoding""gzip");  
  80.    }else {  
  81.     out = response.getWriter();  
  82.    }  
  83.   StringBuilder sBuilder = new StringBuilder();  
  84.    for(int i=0; i!=5000; ++i)  
  85.    {  
  86.     sBuilder.append("Printing the long string... ...!");  
  87.    }  
  88.    out.println(sBuilder);  
  89. out.close();  
  90. }  
  91. }  

你可能感兴趣的:(android)