网页上的信息量是很大的,如果不将数据压缩再回送给浏览器,这样就十分耗费流量,现在我有一些数据要输出给浏览器。

    @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);
    }
    


压缩数据

相关文章:

  • 2021-12-03
  • 2021-08-22
  • 2018-09-14
  • 2022-03-10
  • 2021-10-19
  • 2021-08-11
  • 2022-02-15
猜你喜欢
  • 2021-08-15
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案