请帮我用InflaterOutputStream扩展一个输出流类,用来解压GZIPOutputStream压缩的流,我给400分。 InflaterOutputStream是jdk1.6提供的一个类,我想扩展成输出解压数据流,但基本功不够,想大侠求教,请帮我扩展一下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接用java.util.zip.GZIPOutputStream不就行了,JDK现成有的阿This class implements a stream filter for writing compressed data in the GZIP file format. InflaterOutputStream这是解压输出,GZIPOutputStream是压缩输出,是扩展DeflaterOutputStream生成的 不是有 GZIPInputStream 吗? InflaterInputStreamJDK 文档:This class implements a stream filter for uncompressing data in the "deflate" compression format. It is also used as the basis for other decompression filters, such as GZIPInputStream. 谢谢YidingHe,但我的问题是InflaterOutputStream这是解压输出,GZIPOutputStream是压缩输出,是扩展DeflaterOutputStream生成的,我通过socket传送文件时用了同步,将接收到的信息进行过滤,所有信息都分隔成了byte数组,是文件的将bytes输出为指定的文件,由于原文件是压缩后传过来的,现在需要解压,可时已得到很多压缩后的byte数组,如果写到文件再读出来解压缩再存放回,效率太低,我就想能不能用InflaterOutputStream扩展成像GZIPInputStream一样的输出解压流,一次将压缩的byte数据解压输出成文件。 你可以将 byte 数组组合起来,丢进 ByteArrayInputStream,然后用这个 ByteArrayInputStream 创建 GZIPInputStream。 如果文件很大,丢进 ByteArrayInputStream会报内存溢出的。 不知道你之前是要过滤什么,反正只要实现一个 InputStream 就可以用 GZIPInputStream 了。不管你接收端对于接收到的数据怎么分解怎么组合,对 InputStream 的调用者来说都是透明的。 public SocketThread(Socket socket,int num,ThreadMonitor m1,boolean flag) { //构造函数 flag=true is read flag=false write this.socket=socket; //初始化socket变量 clientnum=num+1; //初始化clientnum变量 this.tm=m1; this.flag=flag; try{is=new BufferedInputStream(new DataInputStream((socket.getInputStream())));os=new BufferedOutputStream(new DataOutputStream((socket.getOutputStream())));}catch(Exception e){System.out.println("Error:"+e);//出错,打印出错信息return null;} }public String write(){ try{byte wbuf[]=tm.getbytes(); os.write(wbuf,0,wbuf.length);//System.out.println("sockthread write"+(new String(wbuf,"UTF8"))+wbuf.length);return new String(wbuf,"UTF8");}catch(Exception e){System.out.println("Error:"+e);//出错,打印出错信息}return null;}public String readLine(){ try{ byte rbuf[]=new byte[32*1024]; int rlen=readLine(rbuf,0,rbuf.length);// System.arraycopy(buf, pos, rbuf, off + total, copy);//System.out.println("socketthread rlen="+rlen+new String(rbuf)); if (rlen>0) { tm.setbytes(rbuf,0,rlen); }if (rlen==-1)return null;//System.out.println(new String(rbuf,"UTF8"));return new String(rbuf,"UTF8");}catch(Exception e){System.out.println("Error:"+e);//出错,打印出错信息}return null;}我的程序中读写都通过ThreadMonitor m1这个同步类,这个类的方法只能得到字节数组,它之前的流里面可能含有字符串消息,也可能有压缩后的文件流,在它之后进行读写,如果读到压缩文件流的字节数据就写入目标输出流里。所以我需要输出流带解压功能类 public SocketThread(Socket socket,int num,ThreadMonitor m1,boolean flag) { //构造函数 flag=true is read flag=false write this.socket=socket; //初始化socket变量 clientnum=num+1; //初始化clientnum变量 this.tm=m1; this.flag=flag; try{is=new BufferedInputStream(new DataInputStream((socket.getInputStream())));os=new BufferedOutputStream(new DataOutputStream((socket.getOutputStream())));}catch(Exception e){System.out.println("Error:"+e);//出错,打印出错信息return null;} }public String write(){ try{byte wbuf[]=tm.getbytes(); os.write(wbuf,0,wbuf.length);//System.out.println("sockthread write"+(new String(wbuf,"UTF8"))+wbuf.length);return new String(wbuf,"UTF8");}catch(Exception e){System.out.println("Error:"+e);//出错,打印出错信息}return null;}public String readLine(){ try{ byte rbuf[]=new byte[32*1024]; int rlen=readLine(rbuf,0,rbuf.length);// System.arraycopy(buf, pos, rbuf, off + total, copy);//System.out.println("socketthread rlen="+rlen+new String(rbuf)); if (rlen>0) { tm.setbytes(rbuf,0,rlen); }if (rlen==-1)return null;//System.out.println(new String(rbuf,"UTF8"));return new String(rbuf,"UTF8");}catch(Exception e){System.out.println("Error:"+e);//出错,打印出错信息}return null;}我的程序中读写都通过ThreadMonitor m1这个同步类,这个类的方法只能得到字节数组,它之前的流里面可能含有字符串消息,也可能有压缩后的文件流,在它之后进行读写,如果读到压缩文件流的字节数据就写入目标输出流里。所以我需要输出流带解压功能类 实现一个 InputStream 类,这个类的 read 方法就是从 ThreadMonitor 中读取数据,这样就可以把字节实时传给 GZIPInputStream 了。 谢谢YidingHe,我用另一种方法解决了,但我还是想要输出解压流这样的类。 我实现的方法就是我在上传的资源http://download.csdn.net/source/1051369的输出与输入类 td里面 table要靠上贴着上面放怎么写? 请问 /= 在JAVA语法中是什么意思? 学习Java反射,大家帮着找错 java jdbc能不能带参数查询? hibernate+spring 中的查询语句 Column这种类型要包含哪个包哟?谢谢 网络IP访问问题,没分了,还请帮助下!感激` displaytag 一个小问题。 谁知道啊 html是否可以调用.jar包,如果不可以,那如何用浏览器运行涉及到好几个目录和包资源的applet? 谁知道JFame和JInternelFrame状态栏怎么用?有没有一个实例子给我? J2SE5新特性,范型与泛型的区别? 从数据库中取数据遇到的问题
This class implements a stream filter for writing compressed data in the GZIP file format.
但我的问题是InflaterOutputStream这是解压输出,GZIPOutputStream是压缩输出,是扩展DeflaterOutputStream生成的,我通过socket传送文件时用了同步,将接收到的信息进行过滤,所有信息都分隔成了byte数组,是文件的将bytes输出为指定的文件,由于原文件是压缩后传过来的,现在需要解压,可时已得到很多压缩后的byte数组,如果写到文件再读出来解压缩再存放回,效率太低,我就想能不能用InflaterOutputStream扩展成像GZIPInputStream一样的输出解压流,一次将压缩的byte数据解压输出成文件。
{ //构造函数 flag=true is read flag=false write
this.socket=socket; //初始化socket变量
clientnum=num+1; //初始化clientnum变量
this.tm=m1;
this.flag=flag;
try{
is=new BufferedInputStream(new DataInputStream((socket.getInputStream())));
os=new BufferedOutputStream(new DataOutputStream((socket.getOutputStream())));
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息return null;
}
}
public String write()
{ try{
byte wbuf[]=tm.getbytes();
os.write(wbuf,0,wbuf.length);
//System.out.println("sockthread write"+(new String(wbuf,"UTF8"))+wbuf.length);
return new String(wbuf,"UTF8");
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
return null;
}
public String readLine()
{
try{ byte rbuf[]=new byte[32*1024];
int rlen=readLine(rbuf,0,rbuf.length);
// System.arraycopy(buf, pos, rbuf, off + total, copy);
//System.out.println("socketthread rlen="+rlen+new String(rbuf));
if (rlen>0)
{
tm.setbytes(rbuf,0,rlen); }
if (rlen==-1)
return null;
//System.out.println(new String(rbuf,"UTF8"));
return new String(rbuf,"UTF8");
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
return null;
}我的程序中读写都通过ThreadMonitor m1这个同步类,这个类的方法只能得到字节数组,它之前的流里面可能含有字符串消息,也可能有压缩后的文件流,在它之后进行读写,如果读到压缩文件流的字节数据就写入目标输出流里。所以我需要输出流带解压功能类
{ //构造函数 flag=true is read flag=false write
this.socket=socket; //初始化socket变量
clientnum=num+1; //初始化clientnum变量
this.tm=m1;
this.flag=flag;
try{
is=new BufferedInputStream(new DataInputStream((socket.getInputStream())));
os=new BufferedOutputStream(new DataOutputStream((socket.getOutputStream())));
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息return null;
}
}
public String write()
{ try{
byte wbuf[]=tm.getbytes();
os.write(wbuf,0,wbuf.length);
//System.out.println("sockthread write"+(new String(wbuf,"UTF8"))+wbuf.length);
return new String(wbuf,"UTF8");
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
return null;
}
public String readLine()
{
try{ byte rbuf[]=new byte[32*1024];
int rlen=readLine(rbuf,0,rbuf.length);
// System.arraycopy(buf, pos, rbuf, off + total, copy);
//System.out.println("socketthread rlen="+rlen+new String(rbuf));
if (rlen>0)
{
tm.setbytes(rbuf,0,rlen); }
if (rlen==-1)
return null;
//System.out.println(new String(rbuf,"UTF8"));
return new String(rbuf,"UTF8");
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
return null;
}我的程序中读写都通过ThreadMonitor m1这个同步类,这个类的方法只能得到字节数组,它之前的流里面可能含有字符串消息,也可能有压缩后的文件流,在它之后进行读写,如果读到压缩文件流的字节数据就写入目标输出流里。所以我需要输出流带解压功能类