Java--数据的压缩.doc_第1页
Java--数据的压缩.doc_第2页
Java--数据的压缩.doc_第3页
Java--数据的压缩.doc_第4页
Java--数据的压缩.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java-数据的压缩3、数据的压缩GzipOutputStream压缩工具流。 - ByteArrayOutputStream压缩容器。:以下是在某个servlet中对指定的数据进行压缩:package cn.itcast.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;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class GzipServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse resp)throws ServletException, IOException /声明准备被压缩的数据String str = Hello你好Hello你好在内存中声明一Hello你好在 +内存中声明一个Hello你好在内存中声明一个Hello你 +好在内存中声明一个容器声明准备被压缩获取准备被压缩 +的数据的字节码的数据容器声明准备被压缩获取准备被压缩的数 +据的字节码的数据容器声明准备被压缩获取准备被压缩的数据的 +字节码的数据个容器声明准备被压缩获取准备被压缩的数据的字节码的 +数据在内存中声明一个容器声明准备被压缩获取准备被压缩的数据 +的字节码的数据;/2:获取准备被压缩的数据的字节码byte src = str.getBytes(UTF-8);/3:在内存中声明一个容器ByteArrayOutputStream destByte = new ByteArrayOutputStream();/:声明压缩的工具流,并设置压缩的目的地为destByteGZIPOutputStream zip = new GZIPOutputStream(destByte);/5:写入数据zip.write(src);/6:关闭压缩工具流zip.close();System.err.println(压缩之前字节码大小:+src.length);/:获取压缩以后数据byte dest = destByte.toByteArray();System.err.println(压缩以后的字节码大小:+dest.length);/8:必须要输出压缩以后字节数组resp.setContentType(text/html;charset=UTF-8);/9:必须要使用字节流来输出信息OutputStream out = resp.getOutputStream();/10:通知浏览器。这是压缩的数据,要求浏览器解压resp.setHeader(Content-encoding,gzip);/11:通知浏览器压缩数据的长度resp.setContentLength(dest.length);/10:输出out.write(dest);:所有页面*。jsp全部压缩只要是输出信息,只有两种方式:Respoonse.getWriter().所有所页面的输出都是resp.getWtier();输出信息字符流。所有的jsp页面,编译后,都是通过JspWriter方式输出的信息。但所有jsp页面都是JspWriter,而jspwriter是对PrintWriter的包装。Response.getOutputStream() 字节流。分析:如果要实现全站的压缩,请先实现对所有servlet中的resp.getWriter输出的数据都压缩 先实现对一个进行压缩。第一步:书写一个类Servlet类。正常输出信息 : resp.,getWriter().print(.);public class OneServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException response.setContentType(text/html;charset=UTF-8);PrintWriter out = response.getWriter();out.println(Hello你好大家同学);第二步:对这上面的这个类进行拦截-Filter,在拦截过程中包装response实现抽像类:HttpServletResponseWrapper package cn.itcast.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class GzipFilter implements Filter public void init(FilterConfig filterConfig) throws ServletException public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException /声明MyResponse包装类MyResponse resp = new MyResponse(HttpServletResponse) response);实例化包装类。/放行时,必须要传递自己包装过的类chain.doFilter(request, resp使用包装类。);public void destroy() /实现对HttpSerlvetResponse的包装class MyResponse extends HttpServletResponseWrapper先声明包装类。public MyResponse(HttpServletResponse response) super(response);第三步:为了可以压缩数据,我们必须要拦截getwriter方法返回的不是apache的Wrtiter对象。以下是完整的代码:package cn.itcast.filter;public class GzipFilter implements Filter public void init(FilterConfig filterConfig) throws ServletException public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException /声明MyResponse包装类MyResponse resp = new MyResponse(HttpServletResponse) response);/放行时,必须要传递自己包装过的类chain.doFilter(request, resp);第二步:这一段实现将数据写到a.txt中去。/目标类调用完成了,返回 以后读取a.txtFile file = new File(d:/a/a.txt);/声明一个缓存的字符串对象StringBuilder sb = new StringBuilder();/读取文件InputStream in = new FileInputStream(file);byte b = new byte1024;int len = 0;while(len=in.read(b)!=-1)sb.append(new String(b,0,len,UTF-8);in.close();第三步:这一段是读取a.txt中的数据。/转成字节开始压缩byte src = sb.toString().getBytes(UTF-8);/声明缓存容器ByteArrayOutputStream destBytes = new ByteArrayOutputStream();/声明压缩流GZIPOutputStream gzip = new GZIPOutputStream(destBytes);/压缩数据gzip.write(src);gzip.close();/获取压缩以后数据byte dest = destBytes.toByteArray();System.err.println(压缩之前:+src.length);System.err.println(压缩以后:+dest.length);第四步:压缩数据。/输出/必须要使用原生 的responseHttpServletResponse res = (HttpServletResponse) response;res.setContentType(text/html;charset=UTf-8);OutputStream out = res.getOutputStream();res.setHeader(Content-encoding, gzip);/必须res.setContentLength(dest.length);out.write(dest);输出压缩以后数据。public void destroy() /实现对HttpSerlvetResponse的包装class MyResponse extends HttpServletResponseWrapper第一步:先声明包装类。public MyResponse(HttpServletResponse response) super(response);Overridepublic PrintWriter getWriter(重写getWriter方法。) throws IOException System.err.println(有人想获取输出流);PrintWriter out = new PrintWriter由于PrintWriter是GBK所以要使用转换流。(new OutputStreamWriter(new FileOutputStream(d:/a/a.txt),UTF-8);return out;第四步:修改包装类Myresponse2,让输出数据放到一个内存缓存区中package cn.itcast.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.doGetchain.doFilter(request, myresp);声明包装为在实例,且放行。/第二步:从myresp2中读取原生的数据byte src = myresp.getSrc();获取原生的数据。/第三步:开始压缩ByteArrayOutputStream destBytes = new ByteArrayOutputStream();GZIPOutputStream zip = new GZIPOutputStream(destBytes);zip.write(src);zip.close();/第三步:输出-使用原生的responseresp.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方法Overridepublic 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.doGetchain.doFilter(request, myresp);/第二步:从myresp2中读取原生的数据byte src = myresp.getSrc();/第三步:开始压缩ByteArrayOutputStream destBytes = new ByteArrayOutputStream();GZIPOutputStream zip = new GZIPOutputStream(destBytes);zip.write(src);zip.close();/第三步:输出-使用原生的responseresp.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 respons

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论