在使用jdk自带zip解压工具解压文件时,调用ZipFile的getInputStream(ZipEntry entry)方法获取实体输入流后,正常关闭getInputStram返回的输入流。zip文件仍然被占用,导致java删除zip文件失败的问题。
解决方法:
在解压完成后调用ZipFile的close()方法关闭所有已打开的输入流。
原因:根据源码(jdk1.6)
若压缩方式为STORED,则getInputStream返回ZipFileInputStream类的输入流,该输入流的close()方法如下:
public void close() {
rem = 0;
synchronized (ZipFile.this) {
if (jzentry != 0 && ZipFile.this.jzfile != 0) {
freeEntry(ZipFile.this.jzfile, jzentry);
jzentry = 0;
}
}
}
// freeEntry releases the C jzentry struct.
private static native void freeEntry(long jzfile, long jzentry);
若压缩方式为DEFLATED,则getInputStream返回InflaterInputStream类的输入流,该输入流的close()方法如下:
protected Inflater inf;
/**
* Closes this input stream and releases any system resources associated
* with the stream.
* @exception IOException if an I/O error has occurred
*/
public void close() throws IOException {
if (!closed) {
if (usesDefaultInflater)
inf.end();
in.close();
closed = true;
}
}
public void end() {
synchronized (zsRef) {
long addr = zsRef.address();
zsRef.clear();
if (addr != 0) {
end(addr);
buf = null;
}
}
}
public class Inflater {
private native static void end(long addr);
}
而ZipFile类提供的close()方法为:
主要区别应该在于Store的压缩方式,执行了closeRequested = true 和close(zf),而ZipFileInputStream只是调用了freeEntry;对于压缩方式为DEFLATED的情况,还未测试。
 /*** Closes the ZIP file.* <p> Closing this ZIP file will close all of the input streams* previously returned by invocations of the {@link #getInputStream* getInputStream} method.** @throws IOException if an I/O error has occurred*/public void close() throws IOException {synchronized (this) {
closeRequested = true;if (jzfile != 0) {
// Close the zip file
long zf = this.jzfile;
jzfile = 0;close(zf);// Release inflaters
synchronized (inflaters) {
int size = inflaters.size();
for (int i = 0; i < size; i++) {
Inflater inf = (Inflater)inflaters.get(i);
inf.end();
}
}
}}}

本人拙见,有不妥之处,请指点。

java.util.zip.ZipFile解压后被java占用问题。相关推荐

  1. Java中zip压缩解压

    1. 解压问题 360压缩文件 使用jdk API 读取压缩文件后解压,报错 java.lang.IllegalArgumentException:MALFORMED 如果是好压压缩文件,使用jdk ...

  2. Java实现Zip文件解压

    2019独角兽企业重金招聘Python工程师标准>>> ##1. 两种java实现zip文件解压方式 使用JDK的原生类java.util.zip,上代码: import java. ...

  3. Java实现Zip压缩包解压

    对zip压缩包的解压是比较常见的应用场景,java代码的实现也很简单.废话不多说,直接上代码吧 一.代码  /** * zip解压 * @param srcFile        zip源文件 * @ ...

  4. JavaDemo——使用java.util.zip压缩和解压

    Demo: /*** 2019年6月20日下午4:59:37*/ package testzip;import java.io.File; import java.io.FileInputStream ...

  5. Java获取压缩包内文件数_使用java.util.zip.ZipFile,压缩包内文件数量过多则报错问题....

    引入的jar包不对,或者你的压缩文件不标准.62616964757a686964616fe78988e69d8331333365646331一般就会报这个错误.关于上面英语的翻译:Key featur ...

  6. 解决——zip压缩包解压后的文件全是乱码问题

    解决:是编码问题,非unicode应用程序的语言,让系统能识别中文编码就行~ 包括可解决的问题:压缩文件解压后文件名乱码.txt文本打开乱码.安装软件出现乱码等一系列问题 解决办法:是中文(简体,中文 ...

  7. ZIP文件解压后文件名乱码解决办法

    在windows下创建的zip包在linux下解压缩后文件名出现乱码,有人说unzip有个-O选项可以制定编码,但我的系统上不行,没有这个选项.最终是用java的jar解压,然后在用convmv更改编 ...

  8. Java实现Zip包解压

    直接上代码: public static void zipDecompress(String sourcePath,String desPath){try {ZipFile zipFile = new ...

  9. 编译环境与生成环境的JDK版本不一样,报:java.util.zip.ZipException: error in opening zip file

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 发布应用 ...

最新文章

  1. It is not safe to rely on the system's timezone settings
  2. Windows核心编程 第六章 线程基础知识 (上)
  3. 受限Boltzmann机(Restricted Boltzmann Machine)
  4. java web filter链_filter过滤链:Filter链是如何构建的?
  5. 《绅士》Typecho个人博客模板主题
  6. 巾帼不让须眉——女生做运维,一样可以很好
  7. MvcPager 免费开源分页控件3.0版发布!
  8. 1177:奇数单增序列
  9. Angular讲义 ---作用域
  10. FreeSWITCH黑名单功能设置
  11. 手机怎样刷机解锁android,安卓手机解锁是什么意思 安卓手机刷机知识介绍【图文】...
  12. windows服务获取登录用户名
  13. 显示当前数据库服务器的ip,怎么查看服务器数据库的ip地址
  14. excel手机版_手机版excel怎么用
  15. 深度学习-【语义分割】学习笔记4 膨胀卷积(Dilated convolution)
  16. 计算H时M分S秒以后是_最全的风机计算公式,学习了!
  17. 2018“百度之星”程序设计大赛 - 复赛 1003 带劲的and和(位运算,很好的题)
  18. 机器学习入门系列05,Classification: Probabilistic Generative Model(分类:概率生成模型)
  19. 爱笑程序员-笑话10则
  20. 汽车的一些简写名词(后续会继续更新)

热门文章

  1. ASEMI整流桥DB207S参数,DB207S概述,DB207S中文资料
  2. 【附源码】计算机毕业设计java中草药管理系统设计与实现
  3. 办公室空调节能集中控制方案
  4. 高职高专代码 本科专业代码
  5. 谷歌浏览器Chrome闪退
  6. 最新全国火车列车时刻查询数据库20090309下载
  7. 【转载】嵌入式开发板通过串口与PC互相传送文件
  8. 【 螺旋方阵 】所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
  9. 工作流系统之二十五 .net工作流系统开发体会
  10. 绿芯丨高性能超低功耗电容式触摸芯片 - GT301L