LoginSignup
1
0

More than 5 years have passed since last update.

【Java】FileNotFoundExceptionによる「ファイルを開きすぎです」の表示が多数出た場合の対処方法

Last updated at Posted at 2018-05-12

環境

  • Windows 7
  • Java 8
  • Spring Framework 5.0.2

事象

エラーログにて「ファイルを開きすぎです」というFileNotFoundExceptionが多数表示される。

Caused by: java.io.FileNotFoundException: /user/local/apache-tomcat-8/**/sample/WEB-INF/**/sample.jar (ファイルを開きすぎです)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:225)
        at java.util.zip.ZipFile.<init>(ZipFile.java:155)
        at java.util.jar.JarFile.<init>(JarFile.java:166)
        at java.util.jar.JarFile.<init>(JarFile.java:103)
   ・
   ・
 (省略)
   ・
   ・
Caused by: java.io.FileNotFoundException: /user/local/apache-tomcat-8/**/sample/WEB-INF/**/sample.jar (ファイルを開きすぎです)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:225)
        at java.util.zip.ZipFile.<init>(ZipFile.java:155)
        at java.util.jar.JarFile.<init>(JarFile.java:166)
        at java.util.jar.JarFile.<init>(JarFile.java:103)

原因

  • プロセスのクローズ漏れによるエラーが原因

ProcessBuilderを使用すると、バックグラウンドでInputStream・OutputStream・ErrorStreamが勝手にオープンされるため、全てのストリームをクローズしないとリソース不足に陥るかららしいです。

package sample;

import java.io.IOException;

public class ProcessExecutor {

    public void execute(String... command) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        Process process = processBuilder.start();
        process.waitFor();
        process.destroy();
    }
}

対処方法

  • Process.destroy()の前に必ずすべてのストリームをcloseする。

以下のように全てのストリームに対して、しっかりとクローズ処理を追加することでエラーが解消された。

package sample;

import java.io.IOException;

public class ProcessExecutor {

    public void execute(String... command) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        Process process = processBuilder.start();
        process.waitFor();

        // 以降追加
        process.getInputStream().close();
        process.getOutputStream().close();
        process.getErrorStream().close();
        process.destroy();
    }
}

参考まとめ

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0