InflaterOutputStream是jdk1.6提供的一个类,我想扩展成输出解压数据流,但基本功不够,想大侠求教,请帮我扩展一下。

解决方案 »

  1.   

    直接用java.util.zip.GZIPOutputStream不就行了,JDK现成有的阿
    This class implements a stream filter for writing compressed data in the GZIP file format.
      

  2.   

    InflaterOutputStream这是解压输出,GZIPOutputStream是压缩输出,是扩展DeflaterOutputStream生成的
      

  3.   

    不是有 GZIPInputStream 吗?
      

  4.   

    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.
      

  5.   

    谢谢YidingHe,
    但我的问题是InflaterOutputStream这是解压输出,GZIPOutputStream是压缩输出,是扩展DeflaterOutputStream生成的,我通过socket传送文件时用了同步,将接收到的信息进行过滤,所有信息都分隔成了byte数组,是文件的将bytes输出为指定的文件,由于原文件是压缩后传过来的,现在需要解压,可时已得到很多压缩后的byte数组,如果写到文件再读出来解压缩再存放回,效率太低,我就想能不能用InflaterOutputStream扩展成像GZIPInputStream一样的输出解压流,一次将压缩的byte数据解压输出成文件。
      

  6.   

    你可以将 byte 数组组合起来,丢进 ByteArrayInputStream,然后用这个 ByteArrayInputStream 创建 GZIPInputStream。
      

  7.   

    如果文件很大,丢进 ByteArrayInputStream会报内存溢出的。
      

  8.   

    不知道你之前是要过滤什么,反正只要实现一个 InputStream 就可以用 GZIPInputStream 了。不管你接收端对于接收到的数据怎么分解怎么组合,对 InputStream 的调用者来说都是透明的。
      

  9.   

     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这个同步类,这个类的方法只能得到字节数组,它之前的流里面可能含有字符串消息,也可能有压缩后的文件流,在它之后进行读写,如果读到压缩文件流的字节数据就写入目标输出流里。所以我需要输出流带解压功能类
      

  10.   

     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这个同步类,这个类的方法只能得到字节数组,它之前的流里面可能含有字符串消息,也可能有压缩后的文件流,在它之后进行读写,如果读到压缩文件流的字节数据就写入目标输出流里。所以我需要输出流带解压功能类
      

  11.   

    实现一个 InputStream 类,这个类的 read 方法就是从 ThreadMonitor 中读取数据,这样就可以把字节实时传给 GZIPInputStream 了。
      

  12.   

    谢谢YidingHe,我用另一种方法解决了,但我还是想要输出解压流这样的类。
      

  13.   

    我实现的方法就是我在上传的资源http://download.csdn.net/source/1051369的输出与输入类