2011-02-23 14 views
20

私はテストオートメーションで研修生として働いています。 EclipseでJunitコードを作成し、Eclipseを使用して実行しています。 FileInputStream関数を使用してExcelシートからデータを取得しています。FileInputStreamを閉じる必要がありますか?

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

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

答えて

22

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

FileInputStream.close()が必要です。

7
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(); 
    } 
} 
+4

ちょっとしたコメント - チェックされたIOExceptionをスローすることを宣言する 'close()'として 'close()'ステートメントをtry/catchで囲む必要があります。実際に、あなたは最終的にそれを使用することはできません。あなたはtry/finallyと実行時例外を持つことしかできません。しかし、IOExceptionやそのサブクラスのようなチェック例外を使うと、try/catchまたはtry/catch/finallyが必要です。try/finallyだけではコンパイルされません。 –

+2

メソッドに対してIOExceptionが宣言されているかどうかによって異なります。あなたがそれを捕まえるなら、あなたはそれをどうするかを知っておくべきです。重要な部分は、finallyブロックにclose()を入れていることです。実際、これを自動処理することは、Java 7で本当に楽しみにしている機能の1つです。 – Axel

6

あなたはプログラムを閉じたり、終了したりする必要があります。

ファイルを閉じない場合は、

  • として混乱の問題に実行することができますしかし、時にはテストを個別に実行されているか、テストのグループが同じプロセスで実行されています。 (したがって、一方向では動作するが他の方法では動作しないテストを行うことができます)
  • 開いているファイルの名前を変更したり、ファイルを削除することはできません。

リソースを常に閉じておくことをお勧めしますが、ユニットテストは必ずしもベストプラクティスに従わなくてもよいスクリプトとして表示されます。

-1

基本CompSci 101は、私たちが開いているリソースを、Javaまたは他の言語で閉じるように指示しています。そう、はい、それらを閉じる必要があります。あなたがそうしないと、悪いジュジュが起きることになります。

また、Javadocを使用するには、習得する必要があります(傾きがあります)。 FileInputStreamとCloseableのJavadocを見てください。答えはそこにあります。

+2

批判や理解をしないで、確立されたルールに盲目的に従うのは本当にひどいアプローチです。 *悪いことが起こる* - ああ、共通?プログラミングは結果を言及することなく、ブードゥーの魔法ではありません(**ファイルは移動できません、一般にメモリリークが導入されるかもしれません、ファイルハンドルのプールは除外されるかもしれません)(https://stackoverflow.com/questions/ 1661322/too-many-open-file-handles)**)適切に解放されていないリソースは、あなたの答えは役に立たず、さらに有害です。 ** Downvoted。** –

+1

Oooo、私は演説の形を使い、あなたは「彼がブードゥーを信じているZOMG」に行きます(「ああ、彼はそれを綴りませんでした」と言っています)。その結果を綴っていない他のいくつかの回答は、あなたが負担していない限り、偏向したハイ・ウマの石鹸ボックスをたくさん登っているだけです。このスレッドの人はいなかったのですか?)彼らは適切な文献を見つけるのは簡単であり、小規模な研究をしている人は誰でも利用できます。 –

5

それは、あなたが使用するリソースを閉じるには、常に良い考えですしかし

あなたは、リソースBにリソースを使用している場合は、それはそれならばB代わりのを閉じるために賢明ですそのための方法があります。あなたがWorkbookを閉じて、それがFileInputStreamを閉鎖することをWorkbokに依存するより良いいただきたいので、あなたの場合は

は、あなたは、WorkbookFileInputStreamを使用しています。

getWorkbook()方法の終わりに、この特定のケースで

、実際には、Workbookwill closeFileInputStreamが、それはゴミを収集することができるようにcloseWorkbookにまだ良いアイデアです。

3

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

すでに答えとしてではなく、別の努力以下の方法は、try with resources

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()メソッドを呼び出す必要はありませんです。

0

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

関連する問題