私はテストオートメーションの研修生として働いています。私はEclipseでJunitコードを作成し、Eclipseを使用して実行しています。その中で、FileInputStream関数を使用してExcelシートからデータを取得しています。
FileInputStream fi=new FileInputStream("c:\\search.xls");
Workbook w=Workbook.getWorkbook(fi);
Sheet s=w.getSheet(0);
Inputstream関数を閉じる必要はありますか?もしそうなら、いくつかのコーディングを教えてください。
はい、システムリソースを解放したい場合は、入力ストリームをclose
する必要があります。
FileInputStream.close()
が必要です。
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();
}
}
Close()するか、プログラムを終了する必要があります。
ただし、次のようにファイルを閉じないと、混乱する可能性があります。
終了したリソースは常に閉じることがベストプラクティスですが、ユニットテストは、常にベストプラクティスに従う必要のないスクリプトと見なしています。
使用するリソースを閉じることは常に良い考えです[〜#〜]しかし[〜#〜]:
リソース[〜#〜] a [〜#〜]をリソース[〜#〜] bで使用する場合[〜#〜]、閉じるのが賢明です[〜#〜] b [〜#〜]の代わりに[〜#〜] a [〜#〜]メソッドがある場合。
あなたの場合、FileInputStream
でWorkbook
を使用するので、Workbook
を閉じて、Workbok
がFileInputStream
。
この特定のケースでは、実際にはWorkbook
will closeFileInputStream
がgetWorkbook()
メソッドの最後にありますが、それでも- 閉じるWorkbook
ガベージコレクションできるようにします。
はい!リソースを使い終わったら、必ず一度リソースを解放する必要があります。 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を閉じる必要があるというのは誤りです。
私は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