读:
ZipInputStream zipis = new ZipInputStream(new FileInputStream(f));zipis.getNextEntry();DataInputStream dis = new DataInputStream(zipis);
写:
ZipOutputStream zipos = new ZipOutputStream(new FileOutputStream(f));

zipos.putNextEntry(new ZipEntry("zip"));DataOutputStream os = new DataOutputStream(zipos);目前只了解这些,我想做的是利用这个对一个临时文件进行解压缩操作。还有一个问题是,在写的时候应该是什么时机去调这个zipos.putNextEntry(),这个是连续写入吗?我用个小程序实验了下,压缩文件能建立,但是写进去的东西解不出了。
请教下如何处理为好。

解决方案 »

  1.   

    我学习 Zip  时候写的一小段代码
    public class TestZip { public static void main(String[] args) throws Exception {
    ZipEntry zipEn = new ZipEntry("1.html");
    FileInputStream in = new FileInputStream("D:\\tempmomi\\1.htm");
    FileOutputStream outFile = new FileOutputStream("D:\\1.zip");
    ZipOutputStream out =
    new ZipOutputStream(new BufferedOutputStream(outFile));
    out.putNextEntry(zipEn);
    byte[] data = new byte[in.available()];
    in.read(data);
    out.write(data);
    out.close();
    }
    }
    pubNextEntry是在你放下一个文件或者文件夹时调用。
      

  2.   

    这个是我学习的时候查到的别人写的例子。//java.util.zip包提供了数据??和解??的?
    import java.io.*;
    import java.util.zip.*;
    public class Zip {
    static final int BUFFER = 2048;
    static boolean flag = false;
    public static void main(String args[]) throws IOException {
    File file = new File("E:\\eclipse\\workspace\\tempwebtest\\WEB-INF");
    FileInputStream file1 = new FileInputStream(ZipSubdirectory(file));
    }
    //ZipSubdirectory函数将一个指定目?(包括它子目?)??成一个同名??文件(?里称?"ORIGIN")
    public static File ZipSubdirectory(File myDir) throws IOException {
    //?建?冲?入流BufferedInputStream 
    BufferedInputStream origin = null;
    //?建ZipOutputStream?象,将向它??希望写入文件的?出流
    File zipFile = new File(myDir.getName() + ".zip");
    FileOutputStream fos = new FileOutputStream(zipFile);
    ZipOutputStream out =
    new ZipOutputStream(new BufferedOutputStream(fos, BUFFER));
    //dirContents[]?取当前目?(myDir)所有文件?象(包括子目?名)
    File dirContents[] = myDir.listFiles();
    //?建??文件tempFile,使用后?除
    File tempFile = null;
    try {
    //?理当前目?所有文件?象,包括子目?
    for (int i = 0; i < dirContents.length; i++) {
    //使用??方法将当前目?的子目??成一个ZIP文件,并作?一个ENTRY加?"ORIGIN" 
    if (dirContents[i].isDirectory()) {
    tempFile = ZipSubdirectory(dirContents[i]);
    flag = true;
    } //如果当前文件不是子目?
    else {
    tempFile = dirContents[i];
    //flag??tempFile是否由子目???成的ZIP文件
    flag = false;
    }
    System.out.println("Compress file: " + tempFile.getName());
    FileInputStream fis = new FileInputStream(tempFile);
    origin = new BufferedInputStream(fis, BUFFER);
    //?被?取的文件?建??条目
    ZipEntry entry = new ZipEntry(tempFile.getName());
    byte data[] = new byte[BUFFER];
    int count;
    //在向ZIP?出流写入数据之前,必?首先使用out.putNextEntry(entry); 方法安置??条目?象 
    out.putNextEntry(entry);
    //向ZIP 文件写入数据 
    while ((count = origin.read(data, 0, BUFFER)) != -1) {
    out.write(data, 0, count);
    } //tempFile是??生成的ZIP文件,?除它
    if (flag == true) {
    flag = tempFile.delete();
    System.out.println(
    "Delete file:" + tempFile.getName() + flag);
    } //???入流 
    origin.close();
    }
    out.close();
    } catch (Exception e) {
    System.out.println(e);
    } //??返回 
    return zipFile;
    }
    }
      

  3.   

    过程是大概是这样的1.创建Zip文件输出流 --> 2.创建新的实体 --> 3.向输出流写入 
    --> 4.如果还有其他文件返回2 --> 关闭输出流。解压就是反过来。
    取得实体,读取输出流
      

  4.   

    .......
    Object[] temp = list.toArray();
    String[] filenames=new String[list.size()];
    for(int b=0;b<list.size();b++){
     filenames[b]=temp[b].toString();
    }
    try{
     dtzip=dt.getDate()+dt.getTime();
     byte[] buf= new byte[1024];
     String outFilename=path+"\\download\\"+dtzip+".zip";
     ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(outFilename));
     FileInputStream in=null;
     for(int i=0;i<filenames.length;i++)   
     {
     in=new FileInputStream(path+"\\upload\\"+filenames[i]);
     File dir = new File(path+"\\upload\\"+filenames[i]);
     String src=dir.getName();
     outputStream.putNextEntry(new ZipEntry(src));
     int len;
     while((len=in.read(buf))>0)
     {
     outputStream.write(buf,0,len);
     }
     }
     outputStream.close();
     in.close();
    }
    catch(Exception ezip){
     out.println(ezip);
    }
      

  5.   

    下面是我以前开发中经过测试过的压缩,解压缩源代码!lz,如果觉得满意的话就给分!
    压缩的源代码:
    package com.javaftp;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    //import java.io.IOException;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;//import org.apache.tools.zip.ZipOutputStream;
    //import org.apache.tools.zip.ZipEntry;/**
     * 
     * @author mengnan
     */
    public class Zip {
    //压缩一个文件
    public static void ZipFile(File fileToZip, ZipOutputStream zos) {
    try {
    // String getPath() 将此抽象路径名转换为一个路径名字符串。
    String path = fileToZip.getPath(); //char charAt(int index) 返回指定索引处的 char 值
    if (path.charAt(1) == ':')
    path = path.substring(3); /*
     * 
     * public ZipEntry(String name)使用指定名称创建新的 ZIP 条目 public void
     * putNextEntry(ZipEntry e) e - 要写入的 ZIP 条目 开始写入新的 ZIP
     * 文件条目并将流定位到条目数据的开始处 注意getNextEntry和pubNextEntry的区别
     * zos.putNextEntry();
     */ zos.putNextEntry(new ZipEntry(path)); /*
     * FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,
     */
    FileInputStream fis = new FileInputStream(fileToZip);
    int c; /*
     * public int read():从此输入流中读取一个数据字节 返回:下一个数据字节;如果已到达文件末尾,则返回 -1。
     */
    while ((c = fis.read()) != -1) zos.write(c);
    fis.close();
    zos.closeEntry();
    } catch (Exception ex) {
    ex.printStackTrace();
    } } public static void findSubFiles(String start, ZipOutputStream zos) {
    System.out.println(start);
    //File(String pathname) 通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
    File fileStart = new File(start);
    // 要压缩的(start),如果是一个文件,调用ZipFile压缩之,然后返回
    if (fileStart.isFile()) {
    ZipFile(fileStart, zos);
    return;
    }

    //如果不是文件,就是子目录,执行下面的操作
    //list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
    String[] subFn = fileStart.list();//取出该子目录下的文件名和子目录名
    // 下面的 for 处理这些文件或子目录
    for (int i = 0; i < subFn.length; i++) {
    File subFile = new File(start + "\\" + subFn[i]); if (subFile.isFile()) {//如果是一个文件,调用ZipFile压缩之
    ZipFile(subFile, zos);
    System.out.println(subFile.getName());
    } else
    //不是文件,就是子目录,递归之,再找。
    findSubFiles(start + "\\" + subFile.getName(), zos);
    }
    } public static void main(String[] args) {
    try { String[] folders = { "f:\\aa" };
    FileOutputStream fos = new FileOutputStream("e:\\aa.zip");
    //class ZipOutputStream此类为以 ZIP 文件格式写入文件实现输出流过滤器。包括对已压缩和未压缩条目的支持。 //创建新的 ZIP 输出流。
    ZipOutputStream zos = new ZipOutputStream(fos);
    //folders.length的值是1
    for (int i = 0; i < folders.length; i++) { System.out.println("Writing file " + folders[i]);
    findSubFiles(folders[i], zos);
    }
    zos.close();
    fos.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }解压缩的源代码:
    package com.javaftp;
    import java.io.*;
    import java.util.zip.*;
    public class UnZip { 
    static final int BUFFER = 2048;public static void main(String argv[]) {
        try {
          //  String fileName = "e:\\aa.zip";  //待解压缩的文件名
        
         String fileName = "e:\\AMMPDF.zip";
            /*
             * 创建一个File实例file
              
           public class File 为文件和目录路径名的抽象表示形式。
            构造方法File(String pathname) 
            通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
            */
            File file = new File(fileName);
            
            //从文件名中提取出子目录(路径)名
            //lastIndexOf(String str)返回在此字符串中最右边出现的指定子字符串的索引
            int n=fileName.lastIndexOf(".");
            //String folderName = fileName.substring(0,n);
            String path = "c:\\02\\source\\";
            String folderName = path + fileName.substring(3,n);
            System.out.println(n);
            File folder = new File(folderName);
       
          //  folder.mkdir(); //创建子目录(路径)
            
            System.out.println(folderName);
            BufferedOutputStream dest = null;
            FileInputStream fis = new FileInputStream(file);
            ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
            //ZipEntry类用于表示 ZIP 文件条目
            ZipEntry entry;
           
           // getNextEntry() 读取下一个 ZIP 文件条目并将流定位到该条目数据的开始处
            while((entry = zis.getNextEntry()) != null) {
              if (entry.isDirectory()) continue;
                System.out.println("Extracting: " +entry);
                int count;
                byte data[] = new byte[BUFFER];
                /*write the files to the disk
                FileOutputStream(String name)
                  创建一个向具有指定名称的文件中写入数据的输出文件流。
                 */            File f1 = new File(entry.getName());
                if (f1.getParent()!=null){
                    String subDirName=folderName + "\\" + f1.getParent();
                    File subDir = new File(subDirName);
                    System.out.println(subDir.getAbsolutePath());
                    subDir.mkdirs();
                }
                
                FileOutputStream fos = new FileOutputStream(folderName + "\\" + entry.getName());
                /*BufferedOutputStream(OutputStream out, int size)
                   创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。
                 */
                dest = new BufferedOutputStream(fos, BUFFER);
                while ((count = zis.read(data, 0, BUFFER)) != -1) {
                    dest.write(data, 0, count);
                }
                //刷新此缓冲的输出流。
                dest.flush();
                dest.close();
            }
            zis.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    }
    主要是一些IO的操作,lz,把IO熟悉了,写这些代码不难的!
      

  6.   

    lz,main函数里都是我以前测试过的,你可以自己创建文件进行测试!
      

  7.   

    有个问题,有没有方法来实现,需求是这样的,一个压缩文件可能会出现一边读一边写的操作,如果用上面的方法,就是那两个(zipOutStream ZipInputStream)共用一个文件,我一直不关这两个流的,结果不正确,有谁做过这样的操作,或是有什么建议提供下。