网页上的信息量是很大的,如果不将数据压缩再回送给浏览器,这样就十分耗费流量,现在我有一些数据要输出给浏览器。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
String s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
//获取数据长度,输出到浏览器
resp.getWriter().write("原来数据长度:"+s.getBytes().length+"</br>");
//相应数据输出到浏览器
resp.getWriter().write(s);
}
原来的长度是:64
数据压缩
压缩的原理是什么?我们知道getOutputStream()和getWriter()都是直接把数据输出给浏览器的。现在我要做的就是让数据不直接输出给浏览器,先让我压缩了,再输出给浏览器。java提供了GZIP压缩类给我们。
查看了下API,gzipOutputStream.write()接收的是byte[]类型的,既然是byte[]类型,那么我就给他一个ByteArrayOutputStream,用GZIPOutputStream写数据的时候,是把数据写到ByteArrayOutputStream上的,等会还要把数据取出来,再写给浏览器,于是就不能以匿名内部类的方式给GZIPOutputStream,必须把ByteArrayOutputStream定义出来.
把压缩后的数据取出来,写给浏览器
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
String s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
GZIPOutputStream gzipOutputStream= new GZIPOutputStream(byteArrayOutputStream);
gzipOutputStream.write(s.getBytes());
//gzipOutputStream有缓冲,把缓冲清了,并顺便关闭流
gzipOutputStream.close();
//将压缩的数据取出来
byte [] bytes = byteArrayOutputStream.toByteArray();
//获取数据长度,输出到浏览器
resp.setHeader("Content-Encoding","gzip");
resp.getOutputStream().write(bytes);
System.out.println("压缩后的数据长度:"+bytes.length);
}