【问题标题】:Unzip file with special character through java.util.zip library通过 java.util.zip 库解压带有特殊字符的文件
【发布时间】:2016-04-29 13:46:48
【问题描述】:

我有我的 zip 文件,里面有几个文件。当我运行我的解压缩代码时:

public ArrayList<String> unzip(String zipFilePath, String destDirectory, String filename) throws IOException {
        ArrayList<String> pathList = new ArrayList<String>();
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdir();
        }
        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
        ZipEntry entry = zipIn.getNextEntry();
        // iterates over entries in the zip file
        while (entry != null) {
            //          Original file name  
            //          String filePath = destDirectory + File.separator + entry.getName();
            int _ordPosition = entry.getName().indexOf("_ord");
            if (_ordPosition<0)
                throw new DatOrderException("Files inside zip file are not in correct format (please order them with _ordXX string)");
            String ord = entry.getName().substring(_ordPosition,_ordPosition+6); 
            String filePath = destDirectory + File.separator + filename + ord + "."+ FilenameUtils.getExtension(entry.getName());
            if (!entry.isDirectory()) {
                // if the entry is a file, extracts it
                pathList.add(filePath);
                extractFile(zipIn, filePath);
            } else {
                // if the entry is a directory, make the directory
                File dir = new File(filePath);
                dir.mkdir();
            }
            zipIn.closeEntry();
            entry = zipIn.getNextEntry();
        }
        zipIn.close();
        return pathList;
    }

如果档案中的文件包含特殊字符,例如 º 我在行上收到格式错误消息的异常

ZipEntry entry = zipIn.getNextEntry();

是否可以重命名此文件或修复此错误?谢谢

【问题讨论】:

  • 它似乎与 ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath),Charset.forName("IBM437"));我正在测试它

标签: java file zip


【解决方案1】:

尝试使用正确的字符编码读取 zip 文件 - 使用 ZipInputStream(java.io.InputStream, java.nio.charset.Charset) 而不是 ZipInputStream(java.io.InputStream)

【讨论】:

    【解决方案2】:

    正如@Andrew Kolpakov 建议的那样,与

     ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath),Charset.forName("IBM437"));
    

    它似乎有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 2014-04-17
      • 2014-05-27
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多