国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java—數據的壓縮1 (51)

2019-11-14 23:58:43
字體:
來源:轉載
供稿:網友
java—數據的壓縮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;

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你" +

"好在內存中聲明一個<br/>容器聲明準備被壓縮獲取準備被壓縮" +

"的數據的字節碼的數據容器聲明準備被壓縮獲取準備被壓縮的數" +

"據的字節碼的數據容器聲明準備被壓縮獲取準備被壓縮的數據的" +

"字節碼的數據個容器聲明準備被壓縮獲取準備被壓縮的數據的字節碼的" +

"數據在內存中聲明一個容器聲明準備被壓縮獲取準備被壓縮的數據" +

"的字節碼的數據";

//2:獲取準備被壓縮的數據的字節碼

byte[] src = str.getBytes("UTF-8");

//3:在內存中聲明一個容器

ByteArrayOutputStream destByte = new ByteArrayOutputStream();

//4:聲明壓縮的工具流,并設置壓縮的目的地為destByte

GZIPOutputStream zip = new GZIPOutputStream(destByte);

//5:寫入數據

zip.write(src);

//6:關閉壓縮工具流

zip.close();

System.err.println("壓縮之前字節碼大小:"+src.length);

//7:獲取壓縮以后數據

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

}

}

2:所有頁面*。jsp全部壓縮

只要是輸出信息,只有兩種方式:

Respoonse.getWriter()..[W1]輸出信息 - 字符流。所有的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.hongxin.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, ServletResponseresponse,

FilterChain chain) throws IOException, ServletException{

//聲明MyResponse包裝類

MyResponseresp = new MyResponse((HttpServletResponse) response);

//放行時,必須要傳遞自己包裝過的類

chain.doFilter(request, resp);

}

public void destroy() {

}

}

//實現對HttpSerlvetResponse的包裝

class MyResponse extendsHttpServletResponseWrapper{

public MyResponse(HttpServletResponse response) {

super(response);

}

}

第三步:為了可以壓縮數據,我們必須要攔截getwriter方法

返回的不是apacheWrtiter對象。

以下是完整的代碼:

package cn.hongxing.filter;

public class GzipFilter implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {

}

public void doFilter(ServletRequest request, ServletResponseresponse,

FilterChain chain) throws IOException, ServletException{

//聲明MyResponse包裝類

MyResponseresp = new MyResponse((HttpServletResponse) response);

//放行時,必須要傳遞自己包裝過的類

chain.doFilter(request,resp);

//目標類調用完成了,返回 以后讀取a.txt

Filefile = new File("d:/a/a.txt");

//聲明一個緩存的字符串對象

StringBuildersb = new StringBuilder();

//讀取文件

InputStreamin = new FileInputStream(file);

byte[] b = new byte[1024];

int len = 0;

while((len=in.read(b))!=-1){

sb.append(new String(b,0,len,"UTF-8"));

}

in.close();

//轉成字節開始壓縮

byte[] src = sb.toString().getBytes("UTF-8");

//聲明緩存容器

ByteArrayOutputStreamdestBytes = new ByteArrayOutputStream();

//聲明壓縮流

GZIPOutputStreamgzip = new GZIPOutputStream(destBytes);

//壓縮數據

gzip.write(src);

gzip.close();

//獲取壓縮以后數據

byte[] dest =destBytes.toByteArray();

System.err.println("壓縮之前:"+src.length);

System.err.println("壓縮以后:"+dest.length);

//輸出

//必須要使用原生 的response

HttpServletResponseres = (HttpServletResponse) response;

res.setContentType("text/html;charset=UTf-8");

OutputStreamout = res.getOutputStream();

res.setHeader("Content-encoding", "gzip");//必須

res.setContentLength(dest.length);

out.write(dest);

}

public void destroy() {

}

}

//實現對HttpSerlvetResponse的包裝

class MyResponse extendsHttpServletResponseWrapper{

public MyResponse(HttpServletResponse response) {

super(response);

}

@Override

public PrintWriter getWriter() throws IOException {

System.err.println("有人想獲取輸出流");

PrintWriter out = new PrintWriter(

new OutputStreamWriter(

new FileOutputStream("d:/a/a.txt"),"UTF-8"));

return out;

}

}

第四步看下一篇


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 孝感市| 宜兰县| 桓仁| 隆林| 威信县| 重庆市| 仁化县| 炎陵县| 和静县| 西吉县| 南郑县| 尼玛县| 巴塘县| 醴陵市| 诏安县| 甘南县| 翼城县| 黔南| 乌鲁木齐县| 兴业县| 全州县| 桐庐县| 杭锦旗| 礼泉县| 准格尔旗| 宁蒗| 陈巴尔虎旗| 新竹市| 农安县| 饶阳县| 尤溪县| 浦北县| 霍城县| 柳林县| 远安县| 通辽市| 博乐市| 黎川县| 永和县| 湖北省| 且末县|