大家好,下面是一段30来行的程序,这段程序运行时会压缩G:/aaa目录下的文件,做成.zip文件输出到JAVA的默认目录,现在的问题是紧可以压缩名字为英文的文件,假如要压缩的文件名为中文就出错,提示找不到文件,请大家帮解答一下。非常感谢
//Zip.java 
import java.io.*;
import java.util.zip.*;
public class Zip {
       static final int BUFFER = 2048;
  
       public static void main (String argv[]) {
              try {
                   BufferedInputStream origin = null;
                   FileOutputStream dest = new FileOutputStream("myfigs.zip");
                   ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
                   //out.setMethod(ZipOutputStream.DEFLATED);
                   byte data[] = new byte[BUFFER];
                   // get a list of files from current directory
                   File f = new File("G:/aaa");
                   String files[] = f.list();
                   for (int i=0; i < files.length; i++) {
                        System.out.println("Adding: "+files[i]);
                        FileInputStream fi = new FileInputStream((files[i]));
                      
                        origin = new BufferedInputStream(fi, BUFFER);
                        ZipEntry entry = new ZipEntry(files[i]);
                        out.putNextEntry(entry);//void putNextEntry(ZipEntry e)
                        //开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。
                        //如果仍处于活动状态,则关闭当前条目。如果没有为条目指定压缩方法,
                        //则使用默认的压缩方法;如果没有为条目设置修改时间,则使用当前时间。
                        int count;
                        while((count = origin.read(data, 0, BUFFER)) != -1) {
                             out.write(data, 0, count);
                        }
                   origin.close();
                   }
                   out.close();
              } catch(Exception e) {
                     e.printStackTrace();
                }
   }} 

解决方案 »

  1.   

    String files[] = f.list();
    这行下面加下面几行:
    String filestmp[] = new String[files.length];
    for(int bb=0;bb<files.length;bb++){
      filestmp[bb] = new String(files[bb].getBytes("iso-8859-1"),"gbk");
    }
    files = filestmp;
    手写,看到哪里写错了改一下,但意思是这样就对了
      

  2.   

    这个是J1.4以前的缺陷,J5.0怎样我不清楚,想解决这个看java源代码自己扩充
      

  3.   

    再试试
    String files[] = f.list();
    这行下面加下面几行:
    String filestmp[] = new String[files.length];
    for(int bb=0;bb<files.length;bb++){
      filestmp[bb] = new String(files[bb].getBytes("iso-8859-1"),"gbk"); 
    //  filestmp[bb] = new String(files[bb].getBytes("gbk"),"iso-8859-1"); 
    //  filestmp[bb] = new String(files[bb].getBytes("utf-8"),"gbk");
    //  filestmp[bb] = new String(files[bb].getBytes("gbk"),"utf-8"); 
    //  filestmp[bb] = new String(files[bb].getBytes("utf-8"),"iso-8859-1"); 
    //  filestmp[bb] = new String(files[bb].getBytes("iso-8859-1"),"utf-8"); 
    }
    files = filestmp;
    把注释一行一行换过,试试
      

  4.   

    你这个根本不是中文问题
     
    FileInputStream fi = new FileInputStream((files[i]));
    这个数组里仅仅是文件名而不是文件的full path
    当然找不到文件接分
      

  5.   

    但是我想问下楼上的syoume,上面的程序在G:/aaa目录下英文名的文件可以压缩,你该不是说中文名的就要指定 full path爸
      

  6.   

    full path=path+filename
    你的数组只有filename
      

  7.   

    我想说的是这里只要FileName就可以了吧,因为处理英文名字的文件都没问题了,压缩中文的有问题而已
      

  8.   

    估计你g:\aaa下面文件 和你应用程序下面的文件差不多
    new FileInputStream("文件名")并不是读取g:\aaa 
    而是读取应用程序目录下面的文件
      

  9.   

    如下修改,修改的地方我有注明。
    ---------------------------------------------------
    File f = new File("G:/aaa");
    ////////////这一行修改/////////////
    File[] files = f.listFiles();
    for (int i=0; i < files.length; i++) {
      ////////////这一行修改/////////////
      System.out.println("Adding: "+files[i].getName());
      FileInputStream fi = new FileInputStream((files[i]));
                      
      origin = new BufferedInputStream(fi, BUFFER);
      ////////////这一行修改/////////////
      ZipEntry entry = new ZipEntry(files[i].getName());
      out.putNextEntry(entry);//void putNextEntry(ZipEntry e)
      int count;
      while((count = origin.read(data, 0, BUFFER)) != -1) {
        out.write(data, 0, count);
      }
      origin.close();
    }
    -------------------------------------------
    用File而不是通过文件名获取文件,
    如果有必要还可用 isFile 确定不是目录才压缩。一般处理文件不要自己拼路径,
    很多琐碎的东西。
      

  10.   

    很好,非常感谢 dengsf,终于可以了,呵呵,同时也非常感谢其他热心的朋友,可惜分不多,只能有选择的给啦,不过我发现了一个新问题,就是用上面的程序做的压缩文件WINRAR不认,解压不出来,不知道又要怎样处理了,大家知道的话还烦热心解答下。