2016-10-25 10 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を使用している唯一の場所です。最終的にファイルを追加してファイルを閉じると、動作しますか? – Futuregeek

+0

"オープンファイルが多すぎます"、/ etc/test/encrypt.propertiesはラクダの背中を壊す最後のストローです。 – Henry

答えて

0

あなたはProperties.load(Reader)/Properties.load(InputStream)のJavdocとして

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

に似た何かを持って言及

指定にこのメソッドが返った後もストリームは開いたままです。

自分でストリームを終了する必要があります。たとえば、次のようになります。

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() 'メソッドを持っているかどうかわかりません。 2)それが存在すると仮定します。私は、プロパティファイルのクローズがどのように実装されているのかわかりません。 – SubOptimal

関連する問題