大家看一下,我学习JAVA中使用ZIP压缩文件时,如是文件中含有文字,将来无论打开压缩包还是解压缩出来的文件,汉字都不能显示,变为%&×¥%#等等。大家帮我看看,什么问题。
源程序:
import java.io.*;
import java.util.zip.*;
import java.util.*;
class ZipCompress{
public static void main(String[] args) throws IOException{
FileOutputStream f=new FileOutStream("test.zip);
CheckedOutputStream csum=new CheckedOutputStream(f,new Adle32());
BufferedOutputStream out=new BufferedOutputStream(csum);
int c;
for(int i=0;i<args.length;i++){
BufferedReader br=new BufferedReader(new FileReader(args[i]));
out.putNextEntry(new ZipEntry(args[i]));
while((c=br.read())!=-1)
out.write(c);
br.close();
}
out.close();
}
}

解决方案 »

  1.   

    hotstud(灰色吉它手) 你好,我看你写的程序有三处错误
    1.FileOutputStream f=new FileOutStream("test.zip);FileOutStream少了put
    2.test.zip少了半个引号
    3.putNextEntry()这个方法只有ZipOutputStream类才有的,BufferedOutputStream 类没有这个方法.
    你的程序,这个是我修改过后正确的
    package test;import java.io.*;
    import java.util.zip.*;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2005</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class ZipCompress1 {
      public static void main(String[] args) {
        FileOutputStream f = null;
        try {
          f = new FileOutputStream("d:\\temp\\out.zip");
        }
        catch (FileNotFoundException ex) {
        }
        CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
        //BufferedOutputStream out = new BufferedOutputStream(csum);
        ZipOutputStream out = new ZipOutputStream(f);
        int c;
        for (int i = 0; i < args.length; i++) {
          BufferedReader br = null;
          try {
            br = new BufferedReader(new FileReader(args[i]));
            out.putNextEntry(new ZipEntry(args[i]));
            while ( (c = br.read()) != -1) {
              System.out.println("args[i]="+args[i]);
              out.write(c);
            }
            br.close();
            out.close();
          }
          catch (Exception ex1) {
          }    }  }}
    不过用这样的方式我创建了一个压缩文件打不开!
    以下是我写的一个程序你参考一下:package test;import java.io.IOException;
    import java.io.*;
    import java.util.zip.*;
    import java.util.*;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2005</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class ZipCompress {
      /**
       * 测试运行
       * @param args
       * @throws IOException
       */
      public static void main(String[] args) throws IOException {
        ZipCompress zip = new ZipCompress();
        try {
          zip.testCreateZip();
        }
        catch (Exception ex) {
          ex.printStackTrace();
        }
      }  /**
       * 取得指定目录下的所有文件列表,包括子目录.
       * @param baseDir File 指定的目录
       * @return 包含java.io.File的List
       */
      private List getSubFiles(File baseDir) {
        List ret = new ArrayList();
        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;
      }  /**
       * 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();
      }  /**
       * 给定根目录,返回另一个文件名的相对路径,用于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;
      }}
      

  2.   

    对了补上一句,我的测试环境是
    Jbuild9,JDK1.5.5
      

  3.   

    楼上的程序仍然有中文乱码问题,我在网上搜罗了一下,发现用ant包中的zip类,非常完美地解决了这个问题。压缩代码如下:
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipOutputStream;public class ZipCompress2 {
        /**
         * 测试运行
         * 
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
            ZipCompress2 zip = new ZipCompress2();
            try {
                zip.testCreateZip();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }    /**
         * 取得指定目录下的所有文件列表,包括子目录.
         * 
         * @param baseDir
         *            File 指定的目录
         * @return 包含java.io.File的List
         */
        private List getSubFiles(File baseDir) {
            List ret = new ArrayList();
            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;
        }    /**
         * zip压缩功能测试. 将d:\\temp\\temp目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
         * 
         * @throws Exception
         */
        public void testCreateZip() throws Exception {
            // 压缩baseDir下所有文件,包括子目录
            String baseDir = "d:\\temp\\temp";
            List fileList = getSubFiles(new File(baseDir));
            System.out.println("fileList=" + fileList);
            // 压缩文件名
            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);
                // 创建一个ZipEntry,并设置Name和其它的一些属性
                ze = new ZipEntry(getAbsFileName(baseDir, f));
                ze.setSize(f.length());
                ze.setTime(f.lastModified());
                System.out.print("Adding: " + f.getPath() + " " + ze);            // 将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();
        }    /**
         * 给定根目录,返回另一个文件名的相对路径,用于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;
        }}
      

  4.   

    另外说一下。以上程序在jdk1.4.2上运行非常的好。ps:不要忘了导入ant.jar文件