要把很多小文件压成zip,每个zip大小不能超过1M

解决方案 »

  1.   

    网上抄来一段:
      Java  1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解压缩的实现比较容易,下面介绍利用ZipEntry、 ZipInputStream和ZipOutputStream三个Java类实现zip数据压缩方式的编程方法。   
        zip压缩文件结构:一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的数据项存储压缩数据。与zip文件有关的几个Java类   
        •类ZipEntry   
            public  ZipEntry(String  name);   
            name为指定的数据项名。   
        •类ZipOutputStream   
            ZipOutputStream实现了zip压缩文件的写输出流,支持压缩和非压缩entry。下面是它的几个函数:   
                public  ZipOutputStream(OutputStream  out);    ∥利用输出流out构造一个ZIP输出流。 
                public  void  setMethod(int  method);    ∥设置entry压缩方法,缺省值为DEFLATED。   
                public  void  putNextEntry(ZipEntry  newe);    ∥如果当前的entry存在且处于激活状态时,                                                        关闭它,在zip文件中写入新的entry-newe并将数据流定位于entry数据项的起始位置,压缩方法为setMethod指定的方法。   
        •类ZipInputStream   
            ZipInputStream实现了zip压缩文件的读输入流,支持压缩和非压缩entry。下面是它的几个函数:   
        public  ZipInputStream(InputStream  in);    ∥利用输入流in构造一个ZIP输出流。   
        public  ZipEntry  getNextEntry();    ∥返回ZIP文件中的下一个entry,并将输出流定位在此entry数据项的起始位置。   
        public  void  closeEntry();    ∥关闭当前的zip  entry,并将数据流定位于下一个entry的起始位置。   
        程序代码及其注释下列的程序实现了数据文件zip方式的压缩和解压缩方法。randomData()函数随机生成50个double数据,并放在 doc字符串变量中;openFile()函数读取ZIP压缩文件;saveFile()函数将随机生成的数据存到ZIP格式的压缩文件中。   
        
    import  java.util.zip.*;   
        import  java.awt.event.*;   
        import  java.awt.*;   
        import  java.lang.Math;   
        import  java.io.*;   
       
        public  class  TestZip  extends  Frame  implements  ActionListener  {   
        TextArea  textarea;  ∥显示数据文件的多行文本显示域   
        TextField  infotip;  ∥显示数据文件未压缩大小及压缩大小单行文本显示域   
        String  doc;  ∥存储随机生成的数据   
        long  doczipsize  =  0;∥压缩数据文件的大小   
        public  TestZip(){    ∥生成菜单   
            MenuBar  menubar  =  new  MenuBar();   
            setMenuBar(menubar);   
            Menu  file  =  new  Menu("File",true);   
            menubar.add(file);   
            MenuItem  neww=  new  MenuItem("New");   
            neww.addActionListener(this);   
        file.add(neww);   
            MenuItem  open=new  MenuItem("Open");   
            open.addActionListener(this);   
            file.add(open);   
            MenuItem  save=new  MenuItem("Save");   
            save.addActionListener(this);   
            file.add(save);   
            MenuItem  exit=new  MenuItem("Exit");   
            exit.addActionListener(this);   
            file.add(exit);   
          ∥随机生成的数据文件的多行文本显示域   
            add("Center",textarea  =  new  TextArea());   
            ∥提示文本原始大小、压缩大小的单行文本显示域   
            add("South",infotip  =  new  TextField());   
        }   
       
        public  static  void  main(String  args[]){   
        TestZip  ok=new  TestZip();   
        ok.setTitle("zip  sample");   
        ok.setSize(600,300);   
        ok.show();   
        }   
       
        private  void  randomData(){   
        ∥随机生成50个double数据,并放在doc字符串变量中。   
        doc="";   
        for(int  i=1;i <51;i++){   
          double  rdm=Math.random()*10;   
          doc=doc+new  Double(rdm).toString();   
          if(i%5  ==  0)  doc=doc+"\n";   
          else  doc=doc+"  ";   
        }   
        doczipsize  =  0;   
        showTextandInfo();   
        }   
        private  void  openFile(){   
        ∥打开zip文件,将文件内容读入doc字符串变量中。   
        FileDialog  dlg=new  FileDialog(this,"Open",FileDialog.LOA  D);   
        dlg.show();   
        String  filename=dlg.getDirectory()+dlg.getFile();   
        try{   
        ∥创建一个文件实例   
        File  f=new  File(filename);   
        if(!f.exists())  return;  ∥文件不存在,则返回   
        ∥用文件输入流构建ZIP压缩输入流   
        ZipInputStream  zipis=new  ZipInputStream(new  FileInputStream(f));   
        zipis.getNextEntry();   
        ∥将输入流定位在当前entry数据项位置   
        DataInputStream  dis=new  DataInputStream(zipis);   
        ∥用ZIP输入流构建DataInputStream   
        doc=dis.readUTF();∥读取文件内容   
        dis.close();∥关闭文件   
        doczipsize  =  f.length();∥获取ZIP文件长度   
        showTextandInfo();∥显示数据   
        }  catch(IOException  ioe){   
        System.out.println(ioe);   
        }   
        }   
       
        private  void  saveFile(){   
        ∥打开zip文件,将doc字符串变量写入zip文件中。   
        FileDialog  dlg=new  FileDialog(this,"Save",FileDialog.SAVE);   
        dlg.show();   
        String  filename=dlg.getDirectory()+dlg.getFile();   
        try{   
        ∥创建一个文件实例   
        File  f=new  File(filename);   
        if(!f.exists())  return;  ∥文件不存在,则返回   
        ∥用文件输出流构建ZIP压缩输出流   
        ZipOutputStream  zipos=new  ZipOutputStream(new  FileOutputStream(f));   
        zipos.setMethod(ZipOutputStream.DEFLATED);  ∥设置压缩方法   
        zipos.putNextEntry(new  ZipEntry("zip"));   
        ∥生成一个ZIP  entry,写入文件输出流中,并将输出流定位于entry起始处。   
        DataOutputStream  os=new  DataOutputStream(zipos);   
        ∥用ZIP输出流构建DataOutputStream;   
        os.writeUTF(doc);∥将随机生成的数据写入文件中   
        os.close();∥关闭数据流   
        doczipsize  =  f.length();   
        ∥获取压缩文件的长度   
        showTextandInfo();∥显示数据   
        }  catch(IOException  ioe){   
        System.out.println(ioe);   
        }   
        }   
        private  void  showTextandInfo(){   
        ∥显示数据文件和压缩信息   
        textarea.replaceRange(doc,0,textarea.getText().length());   
        infotip.setText("uncompressed  size:  "+doc.length()+"compressed  size:  "+dc  zipsize);   
        }   
       
        public  void  actionPerformed(ActionEvent  e){   
        String  arg  =  e.getActionCommand();   
        if  ("New".equals(arg))  randomData();   
        else  if  ("Open".equals(arg))  openFile();   
        else  if  ("Save".equals(arg))  saveFile();   
        else  if  ("Exit".equals(arg)){   
          dispose();∥关闭窗口   
          System.exit(0);∥关闭程序   
        }   
        else  {   
          System.out.println("no  this  command!");   
        }   
        }   
        } 要不楼主试试调用 zip.exe 行不行。
      

  2.   

    这段代码看过,太长了没仔细看,有关于大小限制的内容吗?我现在用的是Ant.jar提供的org.apache.tools.ant.taskdefs.Zip,有没有类似的第3方jar包直接提供了类似的功能呢。服务器是Linux,其实也有一个解决方案就是用zipsplit,还得执行linux命令我嫌太麻烦了。
      

  3.   

    把一个大ZIP文件均分一下不就可以了么? 命名和RAR一样,有序号
      

  4.   

    4楼你确定?我试过ZIP文件分割后用winZip和winRar都识别不了呀。
      

  5.   

    不是自己写代码解压缩么? 如果想要标准格式的,还得多研究java.util.zip
      

  6.   

    唉,彻底研究了一下java.util.zip,ZipEntry倒是有个gerCompressSize方法,不过经测试只是在解压时能取到,压缩的时候木有实际用处。暴露的细节太少了,看来希望渺茫,难道这就是zip不支持分卷压缩的原因?linux下的zipsplit程序倒是能实现我要的功能,不过它是对一个已存在的zip包进行分解,有谁了解它的原理吗?
      

  7.   

    最终还是用zipsplit来分割了,直接分卷压缩看来是没戏。谢谢各位关注,新年快乐!
      

  8.   

    服了,这么用Java去实现压缩这种高强度操作罗,Java的效率太低了这应该不是他的长项呀,这东东应该用c/c++吗?