2016-10-25 129 views
0

我用我的應用程序下面的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) 
+4

很可能你不會在你的應用程序某處正確關閉文件。這不一定代表你已經顯示的代碼。 – Henry

+0

但異常顯示「FileNotFoundException:/etc/test/encrypt.properties」。這段代碼是我們使用/etc/test/encrypt.properties的唯一地方。如果我們添加一個finally然後關閉這個文件,它會起作用嗎? – Futuregeek

+0

你得到一個「太多打開的文件」,'/ etc/test/encrypt.properties'只是打破駱駝後面的最後一根稻草。 – Henry

回答

0

最有可能期間的​​的過程中,你有類似

Properties props = new Properties(); 
Reader inStream = new FileReader("/etc/test/encrypt.properties"); 
props.load(inStream); 

東西作爲Properties.load(Reader)/Properties.load(InputStream)提及Javdoc

指定此方法返回後,流將保持打開狀態。

您需要自行關閉流。例如:

Properties props = new Properties(); 
try (Reader inStream = new FileReader("/etc/test/encrypt.properties")) { 
    props.load(inStream); 
} 
+0

在我的代碼中,下面的代碼會工作嗎? finally {enbe.close} – Futuregeek

+0

@Futuregeek您應該考慮在該地點使用[try-with-resource](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)語句讀取屬性文件的位置。我不知道是否'finally {enbe.close(); ''會在你的例子中工作。 1.)我不知道你的類'EncryptionFactoryBean'是否有'close()'方法。假設它存在。我不知道如何實現屬性文件的關閉。 – SubOptimal

相關問題