package compressionFilters;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
public class CompressionResponseStream extends ServletOutputStream {
protected int compressionThreshold = 0; //是否启用压缩的临界值
protected byte[] buffer = null; //临时容纳写入的数据的缓冲区
protected int bufferCount = 0; //缓冲区中实际写如的数据量
protected GZIPOutputStream gzipstream = null;
protected boolean closed = false; //当前流对象是否处于关闭状态
protected int length = -1;
protected HttpServletResponse response = null;
protected ServletOutputStream output = null;
public CompressionResponseStream(HttpServletResponse response)
throws IOException {
super();
closed = false;
this.response = response;
this.output = response.getOutputStream();
}
//设置是否启用压缩的临界值
protected void setBuffer(int threshold) {
compressionThreshold = threshold;
buffer = new byte[compressionThreshold];
}
public void close() throws IOException {
if (closed)
throw new IOException(
"This output stream has already been closed");
/* 根据gzipstream是否为null,就可以知道写入的内容是否达到了
* 启用压缩的临界值,因为达到临界值时,write方法会自动创建
* gzipstream实例对象。
*/
if (gzipstream != null) {
flushToGZip();
gzipstream.close();
gzipstream = null;
} else {
if (bufferCount > 0) {
output.write(buffer, 0, bufferCount);
bufferCount = 0;
}
}
/* 笔者认为这句代码有些问题,如果启用了压缩,在关闭gzipstream流时,
* 底层的output流应该自动关闭,所以,
* 应该将下句代码放进上面的else从语中
*/
output.close();
closed = true;
}
public void flush() throws IOException {
if (closed) {
throw new IOException("Cannot flush a closed output stream");
}
if (gzipstream != null) {
gzipstream.flush();
}
}
//将buffer缓冲区中的数据写入到gzipstream对象中
public void flushToGZip() throws IOException {
if (bufferCount > 0) {
writeToGZip(buffer, 0, bufferCount);
bufferCount = 0;
}
}
public void write(int b) throws IOException {
if (closed)
throw new IOException("Cannot write to a closed output stream");
/* 当已经写入的数据达到了启用压缩的临界值时,
* 则先将buffer缓冲区中的数据写入到gzipstream对象中
*/
if (bufferCount >= buffer.length) {
flushToGZip();
}
buffer[bufferCount++] = (byte) b;
}
public void write(byte b[]) throws IOException {
write(b, 0, b.length);
}
public void write(byte b[], int off, int len) throws IOException {
if (closed)
throw new IOException("Cannot write to a closed output stream");
if (len == 0)
return;
/* 如果buffer缓冲区中剩余的空间能够容纳要写入的数据,
* 则先将这些数据写入到buffer缓冲区中
*/
if (len <= (buffer.length - bufferCount)) {
System.arraycopy(b, off, buffer, bufferCount, len);
bufferCount += len;
return;
}
/* 如果buffer缓冲区中剩余的空间不能够容纳要写入的数据,
* 则先将buffer缓冲区中原有的数据写入到gzipstream对象中
*/
flushToGZip();
/* 腾空buffer缓冲区中原有的数据后,判断整个buffer缓冲区是否能够
* 容纳要写入的数据,如果能,将这些数据写入到buffer缓冲区中
*/
if (len <= (buffer.length - bufferCount)) {
System.arraycopy(b, off, buffer, bufferCount, len);
bufferCount += len;
return;
}
/* 如果整个buffer缓冲区的空间都不能够容纳要写入的数据,
* 则直接将这些数据写入到gzipstream对象中
*/
writeToGZip(b, off, len);
}
/* 向gzipstream对象中写入数据,如果是第一次写入,
* 则还需要首先创建出gzipstream实例对象*/
public void writeToGZip(byte b[], int off, int len) throws IOException {
if (gzipstream == null) {
response.addHeader("Content-Encoding", "gzip");
gzipstream = new GZIPOutputStream(output);
}
gzipstream.write(b, off, len);
}
/* ServletOutputStream类与OutputStream类中都没有定义closed这个方法,
* 不知这里为何实现这一个方法,笔者看来纯属多余 */
public boolean closed() {
return (this.closed);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
JavaWeb高级特性书中源代码 (257个子文件)
compile.bat 235B
compile.bat 223B
compile.bat 216B
compile.bat 149B
FileUpload.html 519B
file_upload.html 510B
login.html 349B
index.html 165B
articles.html 142B
error.html 122B
visitor.html 47B
article2.html 21B
article1.html 21B
CompressionResponseStream.java 5KB
CompressionServletResponseWrapper.java 4KB
UploadServlet.java 4KB
MultipartRequest.java 3KB
CompressionFilter.java 3KB
MyAttributeListener.java 2KB
FirstFilter.java 2KB
NumberFormatExam.java 2KB
HtmlFilterTag.java 1KB
HtmlFilterTag.java 1KB
LogonFilter.java 1KB
DateFormatExam.java 1KB
UploadFilter.java 1KB
MessageFormatExam3.java 1KB
UseBeanTag.java 1KB
ListTag.java 1KB
MyBean.java 1KB
MessageFormatExam2.java 1KB
MyListener.java 1KB
DateParseExam.java 934B
NumberParseExam.java 933B
ReadFileTag.java 911B
TestMemoryTag.java 851B
FragmentDemo.java 849B
ReadFileTag.java 835B
ThreadTag.java 825B
IterateTag.java 775B
FirstFilter.java 774B
ValidateTag.java 757B
MessageFormatExam1.java 756B
MessageFormatExam4.java 755B
ValidateTag.java 736B
HTMLFilter.java 723B
TestAttributeTag.java 722B
CountListener.java 714B
UserBean.java 705B
SimpleTagDemo.java 678B
ChoiceFormatExam.java 654B
BodyTagDemo.java 651B
MessageFormatExam1.java 601B
MyResources.java 593B
IterateTagDemo.java 572B
LocaleExam.java 569B
MyResources_de.java 536B
MyTagExtraInfo.java 509B
DisplayUserInfoTag.java 499B
MyTagExtraInfo.java 466B
ViewIPTag.java 454B
MyResourcesBundleExam.java 446B
MyResBundleExam.java 438B
HelloWorldSimpleTag.java 318B
MyResources.java 271B
MyResources_de.java 207B
x_parse2.jsp 2KB
sql_transaction.jsp 1KB
sql_update.jsp 1KB
c_forEach_col2.jsp 1KB
doUpload.jsp 1KB
logon.jsp 1KB
panel.jsp 1008B
x_transform.jsp 951B
products.jsp 896B
fmt_formatNumber.jsp 887B
fmt_timeZone.jsp 837B
sql_query.jsp 789B
c_set2.jsp 747B
x_forEach.jsp 744B
webi18n.jsp 722B
c_import.jsp 709B
fmt_formatDate.jsp 708B
x_parse.jsp 695B
c_forEach_col.jsp 694B
c_remove.jsp 693B
fmt_message.jsp 690B
c_forEach_collection.jsp 666B
c_url.jsp 653B
fmt_setLocale.jsp 644B
TestAttributeListener.jsp 621B
sql_dateParam.jsp 603B
clientLocale.jsp 589B
fmt_parseNumber.jsp 584B
x_set.jsp 552B
fn_length.jsp 536B
c_forTokens.jsp 535B
x_if.jsp 520B
c_forEach_com.jsp 512B
fmt_bundle.jsp 491B
共 257 条
- 1
- 2
- 3
lys1335
- 粉丝: 381
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
- 以下是一个简化的示例,它使用pygame库来模拟烟花动画的框架.txt
- Linux线程同步机制深度解析与实用指南.zip
- PTA题库C语言解题策略与实战.rar
- SVPWM控制技术的simulink建模与仿真【包括simulink模型,参考文献,操作步骤】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0