如何将一个文件夹中多个不同类型的文件压缩至一个压缩包中,并可从压缩包中读出

解决方案 »

  1.   

    用Runtime.getRuntime().exec调用winrar.
    或者使用java.util.zip.ZipInputStream,java.util.zip.ZipOutputStream.
      

  2.   

    可以直接调用WinRAR的命令来压缩
      

  3.   

    laughsmile(海边的星空) ( 一星(中级)) 信誉:104  2005-07-28 21:17:00  得分:0

    用Runtime.getRuntime().exec调用winrar.
    或者使用java.util.zip.ZipInputStream,java.util.zip.ZipOutputStream.
    ================
    ty
      

  4.   

    http://blog.donews.com/redtroy/archive/2005/07/29/486860.aspx
    请参考我的blog的文章
      

  5.   

    import java.io.*;
    import java.util.*;
    import java.util.zip.*;public class ZipCompress {
      private static Test monitor = new Test();
      // Throw exceptions to console:
      public static void main(String[] args)
      throws IOException {
        FileOutputStream f = new FileOutputStream("test.zip");
        CheckedOutputStream csum =
          new CheckedOutputStream(f, new Adler32());
         ZipOutputStream zos = new ZipOutputStream(csum);
         BufferedOutputStream out =
          new BufferedOutputStream(zos);
        zos.setComment("A test of Java Zipping");
        // No corresponding getComment(), though.
        for(int i = 0; i < args.length; i++) {
          System.out.println("Writing file " + args[i]);
          BufferedReader in =
            new BufferedReader(new FileReader(args[i]));
          zos.putNextEntry(new ZipEntry(args[i]));
          int c;
          while((c = in.read()) != -1)
            out.write(c);
          in.close();
        }
        out.close();
        // Checksum valid only after the file has been closed!
        System.out.println("Checksum: " +
          csum.getChecksum().getValue());
        // Now extract the files:
        System.out.println("Reading file");
        FileInputStream fi = new FileInputStream("test.zip");
        CheckedInputStream csumi =
          new CheckedInputStream(fi, new Adler32());
        ZipInputStream in2 = new ZipInputStream(csumi);
        BufferedInputStream bis = new BufferedInputStream(in2);
        ZipEntry ze;
        while((ze = in2.getNextEntry()) != null) {
          System.out.println("Reading file " + ze);
          int x;
          while((x = bis.read()) != -1)
            System.out.write(x);
        }    System.out.println("Checksum: " +
          csumi.getChecksum().getValue());
        bis.close();
        // Alternative way to open and read zip files:
        ZipFile zf = new ZipFile("test.zip");
        Enumeration e = zf.entries();
        while(e.hasMoreElements()) {
          ZipEntry ze2 = (ZipEntry)e.nextElement();
          System.out.println("File: " + ze2);
          // ... and extract the data as before
        }
            }
    }
      

  6.   

    可随意转载,但请注明出处及作者
    SonyMusic
    2003.05.28
    ==========================================================================
    在Java中操作Zip文件,压缩/解压
    package test.nothing;import java.io.*;
    import java.util.*;
    import java.util.zip.*;import com.beaconsystem.util.*;import junit.framework.TestCase;/**
    * @author SonyMusic
    *
    * 用于测试java.util.zip包压缩和解压缩文件zip文件的例子.
    * 基于JUnit编写,包括两个test方法,和三个辅助方法.
    * 注意到使用过程中操作的全是流,所以不仅仅可以读写文件。这只是一个简单的例子.
    */
    public class TestZipOp extends TestCase {/**
    * Constructor for TestZipOp.
    * @param arg0
    */
    public TestZipOp(String arg0) {
    super(arg0);
    }public static void main(String[] args) {
    junit.textui.TestRunner.run(TestZipOp.class);
    }/**
    * zip压缩功能测试.
    * 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
    * @throws Exception
    */
    public void testCreateZip() throws Exception{
    //压缩baseDir下所有文件,包括子目录
    String baseDir="d:\\temp\\zipout";
    List fileList=getSubFiles(new File(baseDir));//压缩文件名
    ZipOutputStream zos=new ZipOutputStream(new FileOutputStream("d:\\temp\\out.zip"));ZipEntry ze=null;
    byte[] buf=new byte[1024];
    int readLen=0;
    for (int i = 0; i <fileList.size(); i++) {
    File f=(File)fileList.get(i);
    System.out.print("Adding: "+f.getPath()+f.getName());//创建一个ZipEntry,并设置Name和其它的一些属性
    ze=new ZipEntry(getAbsFileName(baseDir, f));
    ze.setSize(f.length());
    ze.setTime(f.lastModified());//将ZipEntry加到zos中,再写入实际的文件内容
    zos.putNextEntry(ze);
    InputStream is=new BufferedInputStream(new FileInputStream(f));
    while ((readLen=is.read(buf, 0, 1024))!=-1) {
    zos.write(buf, 0, readLen);
    }
    is.close();
    System.out.println("   done...");
    }
    zos.close();
    }/**
    * 测试解压缩功能.
    * 将d:\\download\\test.zip文件解压到d:\\temp\\zipout目录下.
    * @throws Exception
    */
    public void testReadZip() throws Exception{
    //InputStream is=new BufferedInputStream(new FileInputStream());
    String baseDir="d:\\temp\\zipout";
    ZipFile zfile=new ZipFile("d:\\download\\Test.zip");
    System.out.println(zfile.getName());
    Enumeration zList=zfile.entries();
    ZipEntry ze=null;
    byte[] buf=new byte[1024];
    while(zList.hasMoreElements()){
    //从ZipFile中得到一个ZipEntry
    ze=(ZipEntry)zList.nextElement();
    if(ze.isDirectory()){
    System.out.println("Dir: "+ze.getName()+" skipped..");
    continue;
    }
    System.out.println("Extracting: "+ze.getName()+"\t"+ze.getSize()+"\t"+ze.getCompressedSize());//以ZipEntry为参数得到一个InputStream,并写到OutputStream中
    OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(baseDir, ze.getName())));
    InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
    int readLen=0;
    while ((readLen=is.read(buf, 0, 1024))!=-1) {
    os.write(buf, 0, readLen);
    }
    is.close();
    os.close();
    System.out.println("Extracted: "+ze.getName());
    }
    zfile.close();
    }/**
    * 给定根目录,返回一个相对路径所对应的实际文件名.
    * @param baseDir 指定根目录
    * @param absFileName 相对路径名,来自于ZipEntry中的name
    * @return java.io.File 实际的文件
    */
    private File getRealFileName(String baseDir, String absFileName){
    String[] dirs=Regex.split("/", absFileName);
    //System.out.println(dirs.length);
    File ret=new File(baseDir);
    if(dirs.length>1){
    for (int i = 0; i <dirs.length-1; i++) {
    ret=new File(ret, dirs[i]);
    }
    }
    if(!ret.exists()){
    ret.mkdirs();
    }
    ret=new File(ret, dirs[dirs.length-1]);
    return ret;
    }/**
    * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
    * @param baseDir java.lang.String 根目录
    * @param realFileName java.io.File 实际的文件名
    * @return 相对文件名
    */
    private String getAbsFileName(String baseDir, File realFileName){
    File real=realFileName;
    File base=new File(baseDir);
    String ret=real.getName();
    while (true) {
    real=real.getParentFile();
    if(real==null) break;
    if(real.equals(base)) break;
    else{
    ret=real.getName()+"/"+ret;
    }
    }
    return ret;
    }/**
    * 取得指定目录下的所有文件列表,包括子目录.
    * @param baseDir File 指定的目录
    * @return 包含java.io.File的List
    */
    private List getSubFiles(File baseDir){
    List ret=new ArrayList();
    //File base=new File(baseDir);
    File[] tmp=baseDir.listFiles();
    for (int i = 0; i <tmp.length; i++) {
    if(tmp[i].isFile()){
    ret.add(tmp[i]);
    }
    if(tmp[i].isDirectory()){
    ret.addAll(getSubFiles(tmp[i]));
    }
    }
    return ret;
    }} 
      

  7.   

    从jar或zip中读文件的时候可以用ZipEntry
    看API,很简单的功能。或者用google找这个方法,搞定。