浏览 10742 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-03-16
最后修改:2009-03-16
网上一般的解决办法是重新编译 unzip 来绕过去。 我查了一下,可以通过 entry.setUnixMode 的方式,将 platform 设置为 Unix,如下: public void setUnixMode(int mode) { // CheckStyle:MagicNumberCheck OFF - no point setExternalAttributes((mode << 16) // MS-DOS read-only attribute | ((mode & 0200) == 0 ? 1 : 0) // MS-DOS directory flag | (isDirectory() ? 0x10 : 0)); // CheckStyle:MagicNumberCheck ON platform = PLATFORM_UNIX; } 这样在解压的时候,就不需要绕过去了。 另外:要使用 ant 的 zip class,才能解决中文文件名乱码问题,JDK默认的我暂时还不知道如何做。 import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; public static void write(File path, File zipFile) throws IOException { ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile)); zip.setEncoding("GBK"); Util.write(path, path, zip); zip.close(); } private static void write(File base, File path, ZipOutputStream zip) throws IOException { URI rel = base.toURI().relativize(path.toURI()); if (path.isDirectory()) { ZipEntry entry = new ZipEntry(rel.getPath()); entry.setUnixMode(755); zip.putNextEntry(entry); zip.closeEntry(); File[] files = path.listFiles(); for (File file : files) { write(base, file, zip); } } else { ZipEntry entry = new ZipEntry(rel.getPath()); entry.setUnixMode(644); zip.putNextEntry(entry); FileInputStream is = new FileInputStream(path); zip.write(IOUtils.toByteArray(is)); is.close(); zip.closeEntry(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-03-16
把ANT的zip代码看完就知道他是怎么做到的了。
其实JDK犯了个不大不小的错误,在写文件名的时候用UTF-8写死了(具体方法不记得了,反正是个私有的)。 |
|
返回顶楼 | |
发表时间:2009-03-17
难道文件名不是UTF8表示的啊。。。。。。。。。。。
|
|
返回顶楼 | |
发表时间:2009-03-17
sdh5724 写道 难道文件名不是UTF8表示的啊。。。。。。。。。。。
这个和文件名没关系,zip里面没有文件和目录,只有键值对。 只是我们常用的zip解压程序都默认永本地字符集解压或者查看,所以看到基于utf-8做的键就只能乱码现实了。 仍外,jdk自带的zip类好像都直接是原生方法了,如果只是私有还好说,可以永反射跳过权限控制,而原生方法就万全没招了。 |
|
返回顶楼 | |