前几天在查看一从jdk1.4升迁到jdk1.5的系统时,发现本该被定时删除的excel文件全都还在原目录下面,真是奇怪.
出现问题的流程大致是:读取一系列的excel文件的信息存入数据库后,先把文件拷贝到备份目录,再删除源excel文件,该项目原先开发和部署环境(j2sdk1.4.2_12+jboss-4.0.5.GA)使用正常,文件也能正常被移动到备份目录,后在另一客户那里实施,换成了jdk1.5,因此我就用jdk1.5编译了一遍,没问题了,就给客户安装演示系统,因为读取excel数据一直都正常(从所导出的报表可得知),所以刚开始几天也没怎么关心这些excel文件是否正常被移动.
发现问题后赶紧debug跟踪,设置断点进行一步步查看,执行完file.delete()语句后,excel又可以被删除了,然后取消断点再运行,我靠,执行完delete()语句后,excel原封不动的待在那里.因为原来系统是运行正常的,于是重新编译部署在jdk1.4+jboss4.0下,运行正常.
真是奇怪了,同样的代码怎么会不一样呢,于是网上搜索关键字("java+java.io.file.delete()"),发现再sun论坛上也有人提出同样的问题,就是删除不了,且无任何错误提示,和我的情况一样,不过他的是jdk1.4下,跟帖的人问他输入流是否确定都close了,或者同时有人在占用该资源的引用,并且建议使用System.gc(),不过问题也没什么解决.后来又看了其他帖子,没什么建设性,索性回到项目源代码上,这是删除文件语句前的读取excel部分代码.
java 代码
- jxl.Workbook rwb = null;
-
- try{
-
-
-
- InputStream is = new FileInputStream(fileAllName);
-
- WorkbookSettings workbookSettings=new WorkbookSettings();
-
-
-
- workbookSettings.setEncoding("GBK");
- rwb = Workbook.getWorkbook(is,workbookSettings);
-
-
-
-
- Sheet rs = rwb.getSheet(0);
-
- int rsColumns = rs.getColumns();
-
- int rsRows = rs.getRows();
- ..............省略..........
-
-
-
-
-
-
- }catch(Exception e)
- {
- }
- finally{
-
- rwb.close();
- }
该代码在jdk1.4下运行正常,按道理该释放的都释放了,联想到搜索资料上多次提及的未释放资源,我把注意力放在了该段代码的7.InputStream is = new FileInputStream(fileAllName); 上,这个输入流却没有放进finally区,照此思路,我把代码改成了下面这个样子
java 代码
- jxl.Workbook rwb = null;
- InputStream is = null;
- try{
-
-
-
- is = new FileInputStream(fileAllName);
-
- WorkbookSettings workbookSettings=new WorkbookSettings();
-
-
-
- workbookSettings.setEncoding("GBK");
- rwb = Workbook.getWorkbook(is,workbookSettings);
-
-
-
-
- Sheet rs = rwb.getSheet(0);
-
- int rsColumns = rs.getColumns();
-
- int rsRows = rs.getRows();
- ..............省略..........
-
-
-
-
-
-
- }catch(Exception e)
-
- }
- finally{
-
- rwb.close();
- try
- {
- is.close();
- }
- catch(Exception e){}
- }
也就是将is也显性的立即释放掉,在j2sdk1.5.0_13+jboss-4.2.0.GA上运行,excel被成功删除,后更新到客户演示环境,也成功了.
究其原因,我估计是jdk1.4和jdk1.5在垃圾回收策略上的不同,在jdk1.4上,is在rwb.close();后就被释放掉了,而在1.5上则有些延迟,这也能解释为何我在jdk1.5上设置断点进行单步跟踪(相当于sheep())的时候能删除,当然,原来代码本身写得也不规范,is应该要被显性释放.
分享到:
相关推荐
Java Development Kit(JDK)是...而64位Windows版的JDK1.5,则是针对Windows用户的一种优化选择,满足了开发者在64位环境下的需求。文件"jdk-1_5_0_17-windows-x64.exe"就是用于安装这个特定版本的JDK的可执行文件。
`jdk-1_5_0_22-linux-amd64.rpm`文件就是专门为Linux的AMD64架构设计的JDK1.5 RPM安装包。以下是安装步骤: 1. **检查系统兼容性**:确保你的Linux发行版是基于RPM的,例如Fedora、CentOS或RHEL,并且系统架构是64...
本压缩包包含了JDK的两个重要版本:1.5(也称为Java 5)和1.6(Java 6),这两个版本在历史上对Java社区有着深远的影响。 JDK 1.5(2004年发布)是Java发展的一个重要里程碑,引入了许多新特性,极大地提升了开发...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
JDK1.5是Java的一个重要版本,它在2004年9月30日正式发布,也被称为Java SE 5.0。这个版本引入了大量的新特性,对Java语言进行了许多改进,提升了开发效率和性能。 标题中的“JDK1.5 32位和64位.rar”表明这是一个...
标题:“jdk1.5 windows版本 64位” 描述:“jdk1.5 windows版本 64位,Java开发依赖环境” 标签:“windows” 在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows...
jdk1.5.exe jdk1.5 jdk1.5下载
Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm
JDK 1.5引入了许多重要的特性,这些特性极大地增强了Java语言的功能和效率。以下是其中的一些关键特性: 1. 静态导入(Static Import): 在JDK 1.5之前,如果要使用类中的静态成员,需要通过类名来引用。JDK 1.5...
《JDK 1.5 for Linux:开启编程之旅的关键》 在计算机科学的世界里,Java是一种广泛应用的面向对象的编程语言,以其“一次编写,到处运行”的特性深受开发者喜爱。而JDK(Java Development Kit)是Java编程环境的...
在JDK1.5中,开发者可以在方法签名中使用省略号(...)表示可变参数。这允许方法接受任意数量的相同类型的参数,如: ```java public void printNumbers(int... nums) { // 代码块 } ``` 这个方法可以接收一个或多...
"JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...
在Linux环境下,Java Development Kit(JDK)1.5是Java编程语言的重要组成部分,它提供了必要的工具和库,使得开发者能够在Linux系统上进行Java应用程序的开发、编译、调试以及运行。本文将深入探讨Linux下JDK1.5的...
虽然NIO.2是在JDK7中正式引入的,但JDK1.5开始引入了新的文件系统模型,为后来的NIO.2打下了基础。 这些特性极大地丰富了Java语言的功能,使得Java在现代软件开发中保持了强大的竞争力。对于Java开发者来说,理解...
测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin
**JDK1.5 中文版文档概述** JDK(Java Development Kit)是Java编程语言的核心组件,由Oracle公司提供,用于开发和运行Java应用程序。JDK1.5,也称为Java SE 5.0,是Java历史上的一个重要版本,发布于2004年9月30日...
这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...
首先,IBM JDK 1.5在兼容性方面进行了加强,确保了与Oracle JDK 1.5的源代码兼容性,这意味着开发者可以在IBM JDK环境下编写和运行已经在Oracle JDK上测试过的Java程序。同时,IBM JDK也针对Linux 64位架构进行了...
至于提供的两个压缩包文件,`jdk-1_5_0_22-windows-i586-p.exe`是32位版本的JDK1.5,适用于32位操作系统的计算机。而`jdk-1_5_0_22-windows-amd64.exe`则是64位版本,用于64位操作系统。选择哪个版本取决于你的系统...
这个压缩包文件“jdk 1.5:1.6:1.7.zip”包含了三个不同版本的JDK:1.5、1.6和1.7,它们都是Java历史上的重要版本,对Java的发展起着关键作用。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要...