java中如何关闭文件_Java – Grails应用程序中的“打开太多文件” – 如何正确关闭打开的文件和流?...

我正在开发一个相当复杂的Web应用程序,它调用几个外部执行的进程,一个grails后台进程和几个文件的读/写 – 所有这些都在一个控制器中.一切都很好,直到我在近距离接近许多请求测试它.当我这样做时,我在我的tomcat catalina日志文件中收到以下java错误消息:

WARNING: Exception executing accept

java.net.SocketException: Too many open files

at java.net.PlainSocketImpl.socketAccept(Native Method)

at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)

at java.net.ServerSocket.implAccept(ServerSocket.java:462)

at java.net.ServerSocket.accept(ServerSocket.java:430)

at org.apache.jk.common.ChannelSocket.accept(ChannelSocket.java:312)

at org.apache.jk.common.ChannelSocket.acceptConnections(ChannelSocket.java:666)

at org.apache.jk.common.ChannelSocket$SocketAcceptor.runIt(ChannelSocket.java:877)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)

at java.lang.Thread.run(Thread.java:662)

起初,经过一些快乐的googeling和阅读之后,我怀疑它可能是一个“系统问题”,即我必须为执行tomcat的用户提高打开文件的限制 – 但事实并非如此.

然后我开始阅读很多关于Java的建议,而不是Grails& Groovy,因为如果你谷歌用Grails这个问题,你找不到这么多.我现在怀疑我的问题是由“太多的开放流”(或类似的东西)引起的,而不是实际打开的文件太多(因为打开文件的数量确实不是很大).

我在一个闭包中有以下四种类型的大量操作:

1)打开文件并写入文件:

def someFile = new File("/some/file.txt")

someFile << "Some content\n"

2)执行命令:

def cmd = "bash some-cmd".execute()

cmd.waitFor()

3)从文件中读取内容:

def fileContent = new File("/some/file.txt").text

4)从Web上的文件中读取内容:

def URL url = new URL("http://www.some.link");

def URLConnection uc = url.openConnection()

def BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()))

...

br.close()

正如您所看到的,我唯一明确关闭的是具有InputStream的BufferedReader,我相信br.close()会将它们都关闭.

我是否必须关闭任何其他已打开的连接,或者更好:我可以这样做吗?这样做的命令是什么?或者你认为我的问题真的不是由“被遗忘的,开放的”流引起的?

我正在使用grails 1.1.1(我知道它已经过时但我在将应用程序迁移到当前版本时遇到了严重问题,经过数小时的工作后我放弃了它),groovy 1.8.0,tomcat 6.0.28,apache 2.2.16关于ubuntu 10.10.

解决我的“太多打开文件”问题的答案与Stephen C的答案非常相关.似乎我的错误的第一个原因确实是未关闭的BufferedReader Stream.我基本上将他的java代码建议直接转移到grails:

def URL url = new URL("http://www.some.link");

def URLConnection uc = url.openConnection()

def BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()))

try{

...

}finally{

br.close()

}

– &GT;这肯定解决了“打开太多文件”的问题,我现在甚至能够看到问题的真正根源.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值