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个文件
jsp:92个
java:53个
xml:31个
5星 · 超过95%的资源 需积分: 3 13 下载量 30 浏览量
2008-10-11
00:04:05
上传
评论
收藏 183KB RAR 举报
温馨提示
本代码是张孝祥老师出版的javaweb高级特性一书的源代码,欢迎使用。
资源推荐
资源详情
资源评论
收起资源包目录
张孝祥-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
article1.html 21B
article2.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
资源评论
- Lavenote2014-03-17很好,资料很清晰,一直喜欢张孝祥的书
yuegaozhai
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功