JDK1.4 读文件的陷井

最近在工作遇到一个问题,too many open files异常,这个异常最终的结果导致Resin停止响应。
在我们的系统中是发现把一个目录当作文件来读取,而JDK1.4对这种情况虽然抛出了异常,但是已经打开的文件句柄没有及时的释放,最终超出了系统的限制,在Linxu下,可以用ulimit -a查看每个进程允许打开的文件个数,我们的是1024.

下面的代码解释了这种问题的发生,运行环境:JDK1.4
import java.io.*;
public class TestFile
{
public static void main(String[] args) throws Exception{
read("/opt/");
Thread.sleep(10000);
}
public static String read( String file )
{
String ret = null;

File f = null;
BufferedInputStream result = null;
ByteArrayOutputStream baos = null;

try{
f = new File( file );
if(!f.exists())
{
System.out.println("file:"+file+" does not exist");
return ret;
}
/*
在这里加上对是否是文件的判断
else if(!f.isFile()){
return null;
}
*/
result = new BufferedInputStream( new FileInputStream(f) );//这里会抛出异常
baos = new ByteArrayOutputStream();
.........
ret = new String(baos.toByteArray());
}catch(Exception e){
e.printStackTrace();
}finally {
try
{
if( result!=null ) result.close();
if( baos!=null ) baos.close();
f = null;
}catch(Exception e) {
e.printStackTrace();
}
}
return ret;
}
}

执行java TestFile之后,在线程等待的时候,用lsof -p 查看该java进程所打开的文件句柄,得到类似下面的结果:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
java 7535 agile cwd DIR 8,1 4096 326402 /opt

可以看到,虽然读取/opt的时候会有异常抛出,但是文件的句柄并没有被释放,累积的结果就是too many open files.

刚才在jdk 1.5上做了测试,这个问题已经解决了,它的提示更友好:
java.io.FileNotFoundException: /opt (Is a directory)
而用lsof -p 查看的时候也没有发现有"/opt"

建议在jdk1.4上做开发的朋友,在读文件的时候一定要多加小心。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值