org.apache.tools.zip在Linux下压缩文件中文乱码问题解决

在 linux下进行 zip,然后在 linux 下 unzip或者直接下载,中文的文件名会乱码。
我查了一下,可以通过 entry.setUnixMode 的方式,将 platform 设置为 Unix,如下:

Java代码 复制代码
  1. public void setUnixMode(int mode) {   
  2.     // CheckStyle:MagicNumberCheck OFF - no point   
  3.     setExternalAttributes((mode << 16)   
  4.                           // MS-DOS read-only attribute   
  5.                           | ((mode & 0200) == 0 ? 1 : 0)   
  6.                           // MS-DOS directory flag   
  7.                           | (isDirectory() ? 0x10 : 0));   
  8.     // CheckStyle:MagicNumberCheck ON   
  9.     platform = PLATFORM_UNIX;   
  10. }  


这样在解压的时候,就不需要绕过去了。

另外:要使用 ant 的 zip class,才能解决中文文件名乱码问题,JDK默认的我暂时还不知道如何做。

Java代码 复制代码
  1. import org.apache.tools.zip.ZipEntry;   
  2. import org.apache.tools.zip.ZipOutputStream;   
  3.     public static void write(File path, File zipFile) throws IOException {   
  4.         ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile));   
  5.         zip.setEncoding("GBK");   
  6.         Util.write(path, path, zip);   
  7.         zip.close();   
  8.     }   
  9.   
  10.     private static void write(File base, File path, ZipOutputStream zip) throws IOException {   
  11.         URI rel = base.toURI().relativize(path.toURI());   
  12.         if (path.isDirectory()) {   
  13.             ZipEntry entry = new ZipEntry(rel.getPath());   
  14.             entry.setUnixMode(755);   
  15.             zip.putNextEntry(entry);   
  16.             zip.closeEntry();   
  17.             File[] files = path.listFiles();   
  18.             for (File file : files) {   
  19.                 write(base, file, zip);   
  20.             }   
  21.         } else {   
  22.             ZipEntry entry = new ZipEntry(rel.getPath());   
  23.             entry.setUnixMode(644);   
  24.             zip.putNextEntry(entry);   
  25.             FileInputStream is = new FileInputStream(path);   
  26.             zip.write(IOUtils.toByteArray(is));   
  27.             is.close();   
  28.             zip.closeEntry();   
  29.         }   
  30.     }  

你可能感兴趣的:(java,jdk,linux,unix,File,Path)