web-dev-qa-db-ja.com

FileInputStreamを閉じる必要がありますか?

私はテストオートメーションの研修生として働いています。私はEclipseでJunitコードを作成し、Eclipseを使用して実行しています。その中で、FileInputStream関数を使用してExcelシートからデータを取得しています。

FileInputStream fi=new FileInputStream("c:\\search.xls");
Workbook w=Workbook.getWorkbook(fi);
Sheet s=w.getSheet(0);

Inputstream関数を閉じる必要はありますか?もしそうなら、いくつかのコーディングを教えてください。

28
Olaganathan.S

はい、システムリソースを解放したい場合は、入力ストリームをcloseする必要があります。

FileInputStream.close() が必要です。

26
asgs
FileInputStream fi=null;
try {
    fi=new FileInputStream("c:\\search.xls");
    Workbook w=Workbook.getWorkbook(fi);
    Sheet s=w.getSheet(0);
} finally {
    if (fi!=null) {
        fi.close();
    }
}
8
Axel

Close()するか、プログラムを終了する必要があります。

ただし、次のようにファイルを閉じないと、混乱する可能性があります。

  • テストが個別に実行される場合や、テストのグループが同じプロセスで実行される場合があります。 (つまり、ある方法では機能するが、別の方法では機能しないテストを行うことができます)
  • 開いているファイルの名前変更や削除はできません。

終了したリソースは常に閉じることがベストプラクティスですが、ユニットテストは、常にベストプラクティスに従う必要のないスクリプトと見なしています。

7
Peter Lawrey

使用するリソースを閉じることは常に良い考えです[〜#〜]しかし[〜#〜]

リソース[〜#〜] a [〜#〜]をリソース[〜#〜] bで使用する場合[〜#〜]、閉じるのが賢明です[〜#〜] b [〜#〜]の代わりに[〜#〜] a [〜#〜]メソッドがある場合。

あなたの場合、FileInputStreamWorkbookを使用するので、Workbookを閉じて、WorkbokFileInputStream

この特定のケースでは、実際にはWorkbookwill closeFileInputStreamgetWorkbook()メソッドの最後にありますが、それでも- 閉じるWorkbookガベージコレクションできるようにします。

5
pcjuzer

はい!リソースを使い終わったら、必ず一度リソースを解放する必要があります。 Javaは、ガベージコレクションの強力なメカニズムを備えています(リソース管理/リークとは異なることに注意してください)。したがって、ガベージコレクタは、将来リソースが必要かどうかを判断できません。リソースの解放に失敗すると、サービス拒否、パフォーマンスの低下などの問題が発生する可能性があります。

すでに答えましたが、別の努力の少ない方法は リソースで試してください

    try (FileInputStream fi = new FileInputStream("c:\\search.xls")) {

         //do something with fi.
         //fi.getChannel() ;

    } catch(IOException e) {
        // exception handling.
    } finally {
    // some statements for finally.
   }

これで、fi.close()メソッドを明示的に呼び出す必要がなくなりました。

最近、コードをリファクタリングしようとしたときに、ブックの作成を別のメソッドに移動する必要があり、そのメソッドでFileInputStreamが作成されました。このメソッドはFileInputStreamを作成し、Workbookを返します。ただし、FileInputStreamはmainメソッドからは見えません。では、メインメソッドの最後でFileInputStreamをどのように閉じますか?答えは、FileInputStreamを閉じる必要はなく、代わりに内部的にFileInputStreamを閉じるワークブックを閉じるだけです。つまり、どうしてもFileInputStreamを閉じる必要があるというのは誤りです。

0
Tony

私はExcelファイルの入力ストリームを確実に閉じるようにしていますが、これはおそらく役立つでしょう

abstract int workWithWorkBook(Workbook workBook);

protected int doWorkBook(Path excelFile) throws IOException {
    File f = excelFile.toFile();

    try (FileInputStream excelContent = new FileInputStream(excelFile.toFile())){
        POIFSFileSystem fileSystem = new POIFSFileSystem(excelContent);
        Workbook workBook = null;
        if (f.getName().endsWith("xls")) {
            workBook = new HSSFWorkbook(fileSystem);
        } else if (f.getName().endsWith("xlsx")) {
            workBook = new XSSFWorkbook(excelContent);
        }
        return workWithWorkBook(workBook);

    }catch (Exception e){
        e.printStackTrace();
        throw e;
    }
}

9b9ea92b-5b63-47f9-a865-fd40dd602cd5

0
Yu Jiaao