zoukankan      html  css  js  c++  java
  • java写入、解压缩zip文件后无法进行删除解决办法

    最近在接口调试中遇到,将ftp上xxx.zip文件下载到本地磁盘,将文件解压缩后,文件无法被删除的问题,不论是用java代码,亦或是直接在磁盘上进行删除,都删除不了,总是提示操作无法完成,因为文件夹已在java(TM) Platform SE binary中打开。

    造成此问题的根本原因在于该文件的引用没有被释放,所以文件处于被占用的情况。

    最初的时候发现io流、out流都已经close了,可是文件还是处于被占用的状态,开始的时候试过将文件的引用置为null,然后手动的调用JVM垃圾回收器System.gc();不过并没有任何效果,经过一级一级的调试,最终发现还是解压缩过程中使用的ZipFile类没有关闭,关闭后,问题就解决了,如果你有遇到类似问题,可以分级调试,看看哪里没有关闭。

    下面是我更改过的解压缩方法:

    /**
      * @param zipFile 解压缩文件
      * @param descDir 压缩的目标地址,如:D:\测试 或 /mnt/d/测试
      * @return
      * @description: 对.zip文件进行解压缩
      * @author: nr
      * @exception:
      * @date: 2019/7/10 13:06
      * @version: 1.0
      */
    @SuppressWarnings("rawtypes")
    public static List<File> upzipFile(File zipFile, String descDir) {
      List<File> list = new ArrayList<>();
      // 防止文件名中有中文时出错
      System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
      try {
        if (!zipFile.exists()) {
          throw new RuntimeException("解压失败,文件 " + zipFile + " 不存在!");
        }
        ZipFile zFile = new ZipFile(zipFile, "GBK");
        for (Enumeration entries = zFile.getEntries(); entries.hasMoreElements();) {
          ZipEntry entry = (ZipEntry) entries.nextElement();
          File file = new File(descDir + File.separator + entry.getName());
          if (entry.isDirectory()) {
            file.mkdirs();
          } else {
            File parent = file.getParentFile();
            if (!parent.exists()) {
              parent.mkdirs();
            }
            InputStream in = zFile.getInputStream(entry);
            OutputStream out = new FileOutputStream(file);
            IOUtils.copy(in, out);
            zFile.close();   //这里没关闭,是我这边的问题所在
            in.close();
            out.flush();
            out.close();
            list.add(file);
          }
        }
      } catch (IOException e) {
        throw new RuntimeException(e.getMessage());
      }
      return list;
    }

  • 相关阅读:
    PythonのTkinter基本原理
    使用 Word (VBA) 分割长图到多页
    如何使用 Shebang Line (Python 虚拟环境)
    将常用的 VBScript 脚本放到任务栏 (Pin VBScript to Taskbar)
    关于 VBScript 中的 CreateObject
    Windows Scripting Host (WSH) 是什么?
    Component Object Model (COM) 是什么?
    IOS 打开中文 html 文件,显示乱码的问题
    科技发展时间线(Technology Timeline)
    列置换密码
  • 原文地址:https://www.cnblogs.com/1012hq/p/11164477.html
Copyright © 2011-2022 走看看