数据的压缩1 (52)

第四步:修改包装类Myresponse2,让输出数据放到一个内存缓存区中

package cn.hongxin.filter;

public class GzipFilter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse resp= (HttpServletResponse) response;
        //声明包装类对象
        MyResponse2 myresp = new MyResponse2(resp);
        //放行,调用oneServlet.doGet
        chain.doFilter(request, myresp);

        //第二步:从myresp2中读取原生的数据
        byte[] src = myresp.getSrc(); 

        //第三步:开始压缩
        ByteArrayOutputStream destBytes = new ByteArrayOutputStream();
        GZIPOutputStream zip = new GZIPOutputStream(destBytes);
        zip.write(src);
        zip.close();

        //第三步:输出-使用原生的response
        resp.setContentType("text/html;charset=UTF-8");
        //获压缩以后数据
        byte[] dest = destBytes.toByteArray();
        System.err.println("压缩之前:"+src.length);
        System.err.println("压缩以后:"+dest.length);
        //设置头
        resp.setContentLength(dest.length);
        resp.setHeader("Content-Encoding","gzip");
        //输出
        OutputStream out = resp.getOutputStream();
        out.write(dest);
    }
    public void destroy() {
    }
}
//第一步:声明response的包装类
class MyResponse2 extends HttpServletResponseWrapper{
    //将这个容器/a.txt,声明成员变量
    private ByteArrayOutputStream srcByte;
    public MyResponse2(HttpServletResponse response) {
        super(response);
    }
    //修改增强getWtier方法
    @Override
    public PrintWriter getWriter() throws IOException {
        srcByte = new ByteArrayOutputStream();
        PrintWriter out =
                new PrintWriter(
                        new OutputStreamWriter(srcByte, "UTF-8"));
        return out;
    }
    //提供一个方法获取原生 的数据
    public byte[] getSrc(){
        return srcByte.toByteArray();
    }
}

第五步:全部的jsp都要经过压缩

只要是通过包装rersponse,且修改了getWriter方法,返回一个自己的printwiter对象。声明一个放原数据的容器对象。就可以实现数据压缩。

public class GzipFilter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse resp= (HttpServletResponse) response;
        //声明包装类对象
        MyResponse2 myresp = new MyResponse2(resp);
        //放行,调用oneServlet.doGet
        chain.doFilter(request, myresp);

        //第二步:从myresp2中读取原生的数据
        byte[] src = myresp.getSrc();

        //第三步:开始压缩
        ByteArrayOutputStream destBytes = new ByteArrayOutputStream();
        GZIPOutputStream zip = new GZIPOutputStream(destBytes);
        zip.write(src);
        zip.close();

        //第三步:输出-使用原生的response
        resp.setContentType("text/html;charset=UTF-8");
        //获压缩以后数据
        byte[] dest = destBytes.toByteArray();
        System.err.println("压缩之前:"+src.length);
        System.err.println("压缩以后:"+dest.length);
        //设置头
        resp.setContentLength(dest.length);
        resp.setHeader("Content-Encoding","gzip");
        //输出
        OutputStream out = resp.getOutputStream();
        out.write(dest);

    }
    public void destroy() {
    }

}
//第一步:声明response的包装类
class MyResponse2 extends HttpServletResponseWrapper{
    //将这个容器/a.txt,声明成员变量
    private ByteArrayOutputStream srcByte;
    private PrintWriter out;
    public MyResponse2(HttpServletResponse response) {
        super(response);
    }
    //修改增强getWtier方法
    @Override
    public PrintWriter getWriter() throws IOException {
        srcByte = new ByteArrayOutputStream();
        out =
                new PrintWriter(
                        new OutputStreamWriter(srcByte, "UTF-8"));
        return out;
    }
    //提供一个方法获取原生 的数据
    public byte[] getSrc(){
        if(out!=null){
            out.close();
        }
         return srcByte.toByteArray();
    }
}

且它的配置如下:

<filter>

<filter-name>zip2</filter-name>

<filter-class>cn.itcast.filter.GzipFilter2</filter-class>

</filter>

<filter-mapping>

<filter-name>zip2</filter-name>

<url-pattern>*.jsp</url-pattern>

</filter-mapping>

同时实现对getoutputstream和getWtier压缩

在myrespons2这个类中,对getoutputstream也要覆盖。

返回一个ServletOutputSteam的匿名对象。

实现witer(int b)方法,将数据写到bytearrayoyutpoutstream.

public ServletOutputStream getOutputStream() throws IOException {

srcByte = new ByteArrayOutputStream();

ServletOutputStream out = new ServletOutputStream() {

//所有IO最终都是一个个字节写出信息

@Override

public void write(int b) throws IOException {

System.err.println(">>>:"+b);

srcByte.write(b);//写到自己的缓存中去-相当于StringBuffer.append(""+b);

}

};

return out;

}

时间: 2024-11-09 00:54:02

数据的压缩1 (52)的相关文章

优化系列 | InnoDB引擎数据表压缩特性测试

一.前言Innodb Plugin引擎开始引入多种格式的行存储机制,目前支持:Antelope.Barracuda两种.其中Barracuda兼容Antelope格式.另外,Innodb plugin还支持行数据压缩特性,不过前提是采用Barracuda行存储格式.表空间启用压缩的前提是innodb表空间文件存储格式修改成:Barracuda,需要修改2个选项:innodb_file_format = "Barracuda"innodb_file_format_max = "

python实现数据的压缩与归档

楔子 尽管现代计算机系统的存储能力日益增长,但生成数据的增长是永无休止的. 无损(lossless)压缩算法以压缩或解压缩数据花费的时间来换取存储数据所需要的空间,以弥补存储能力的不足. Python为最流行的一些压缩库提供了接口,从而能使用不同压缩库读写文件. zlib和gzip提供了GNU zip库,另外bz2允许访问更新的bzip2格式.这些格式都处理数据流而不考虑输入格式,并且提供的接口可以透明地读写压缩文件.可以使用这些模块来压缩单个文件或者数据源标准库还包括一些模块来管理归档(arc

对标准的输入的读取数据进行压缩,然后将其写到标准的输出

//对标准的输入的读取数据进行压缩,然后将其写到标准的输出 package com; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionOutputStream; import o

使用压缩池对读取自标准的谁的数据进行压缩,然后将其写到标准输出

//使用压缩池对读取自标准的谁的数据进行压缩,然后将其写到标准输出 package com; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.CodecPool; import org.apache.hadoop.io.compress.Compress

数据的压缩1 (51)

1 以下是在某个servlet中对指定的数据进行压缩: package cn.hongxing.servlet; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringReader; import java.util.zip.GZIPOutputStream; im

如何实现HttpClient + Web Api架构下数据的压缩

随着移动互联网的发展,各种终端设备的流行,服务器接口要求统一,这个时候RESTful就有用武之地.RESTful一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件.ASP.NET WebAPI,其核心概念就是构建REST风格的Web服务,把一起数据视为资源,无论是服务请求或者是数据操作. HttpClient + Web Api实现Restful服务 下面实现了提交一个对象json数据到服务器上请求创建操作,对应Http的POST请求. 1)  准备需要传递给WebAPI的参数 2)

使用zlib实现gzip格式数据的压缩和解压

注意代码中的注释部分,这里设置是专门针对gzip的,缺少了就不行了,gzip压缩格式和其他格式的区别就在这里. Bytef 就是 unsigned char,uLong就是 unsigned long,这些别名的设置都在zconf.h文件里面. 这里压缩和解压缩的数据都可以用java的GZIPInputStream和GZIPOutputStream来对应解压缩和压缩. 代码片 #ifndef GZIP_H #define GZIP_H #include "zlib/zlib.h" /*

利用JAVA API函数实现数据的压缩与解压缩

综述 许多信息资料都或多或少的包含一些多余的数据.通常会导致在客户端与服务器之间,应用程序与计算机之间极大的数据传输量.最常见的解决数据存储和信息传送的方法是安装额外的存储设备和扩展现有的通讯能力.这样做是可以的,但无疑会增加组织的运作成本.一种有效的解决数据存储与信息传输的方法是通过更有效率的代码来存储数据.这篇文章简要的介绍了数据的压缩与解压缩,并展示了用java.util.zip包来实现数据的压缩与解压缩是多么的方便与高效. 当然用诸如WinZip,gzip,和Java压缩(或jar)之类

InnoDB 数据表压缩原理与限制

http://liuxin1982.blog.chinaunix.net/uid-24485075-id-3523032.html 压缩理念 通过提高CPU利用率和节约成本,降低数据库容量及I/O负载,从而使数据吞吐率得到显著提高. 压缩原理 压缩表减少了磁盘上数据库的大小,使得用户不必频繁地操作写入和读取便可以访问数据.对于 InnoDB的工作量以及传统的用户表而言(特别是在某些读取密集型的应用中,内存有足够的空间存储常用数据),数据压缩不仅大大减少了数据库所需的存储空间,而且还减少了 I/O