我用我的應用程序下面的Java代碼:異常:打開的文件太多
protected String encryptContact(Long contactId) {
if (contactId != null) {
EncryptionFactoryBean enbe = new EncryptionFactoryBean(String.valueOf(contactId), "/etc/test/encrypt.properties");
try {
enbe.SetProperties();
return (String) enbe.getObject();
} catch (Exception e) {
return null;
}
}
return null;
}
在EncryptionFactoryBean.java
public void setProperties()
throws Exception {
Assert.notNull(textToEncrypt, "encryption text cannot be null");
encryptionProperties = loadFile(encryptionFile);
super.setProperties();
}
protected Properties loadFile(String filename)
throws IOException {
Properties properties = null;
if (StringUtils.hasText(filename)) {
File file = new File(filename);
if (file.exists()) {
FileInputStream fi = new FileInputStream(file);
properties = new Properties();
properties.load(fi);
fi.close();
}
}
return properties;
}
上運行的應用,我收到以下錯誤 -
javax.servlet.ServletException:java.io.FileNotFoundException: /etc/test/encrypt.properties(太多打開文件)
無法增加應用程序中的文件限制。有沒有辦法解決這個問題?是否可以通過finally
關閉文件處理程序?
控制檯日誌錯誤:
[org.apache.tomcat.util.net.JIoEndpoint] Socket accept failed java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404)
at java.net.ServerSocket.implAccept(ServerSocket.java:545)
at java.net.ServerSocket.accept(ServerSocket.java:513)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:352)
at java.lang.Thread.run(Thread.java:745)
很可能你不會在你的應用程序某處正確關閉文件。這不一定代表你已經顯示的代碼。 – Henry
但異常顯示「FileNotFoundException:/etc/test/encrypt.properties」。這段代碼是我們使用/etc/test/encrypt.properties的唯一地方。如果我們添加一個finally然後關閉這個文件,它會起作用嗎? – Futuregeek
你得到一個「太多打開的文件」,'/ etc/test/encrypt.properties'只是打破駱駝後面的最後一根稻草。 – Henry