0

次のコードで、タスクに同じ変数を使用して読み取る 2 つのファイルがあります。

    try {
            FileInputStream fis = new FileInputStream(filename1);
            InputStreamReader isr = new InputStreamReader(fis, "UTF8");
            BufferedReader br = new BufferedReader(isr);
            String line="";
            while((line=br.readLine())!=null){
            System.out.println(line);
            }

            // Do i need to add these 3 statements ...
            //br.close();
            //isr.close();
            //fis.close();
            //Without the above 3 statements also the code works fine ...

            fis = new FileInputStream(filename2);
            isr = new InputStreamReader(fis, "UTF8");
            br = new BufferedReader(isr);
            line="";

            while((line=br.readLine())!=null){
            System.out.println(line);
            }

            br.close();
            isr.close();
            fis.close();

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

Java でのファイル読み取りは、開かれたストリームを閉じて、最初のファイル filename1 に関連付けられているシステム リソースを解放することを気にしませんか?

例外はスローされません。

4

3 に答える 3

2

したがって、リソース リークがありますが、そうでない限り問題は発生しません。

  • Windowsでファイルを削除しようとします(ファイルがまだ開いているため)
  • これを何度も行うと、ファイル ハンドルが不足する可能性があります。
于 2014-01-07T09:45:29.070 に答える
1

コードは機能しますが、良い習慣ではありません。

ガベージ コレクタが実行を決定し、最初のオブジェクトの割り当てを解除すると、Java は最初のファイルを自動的に閉じFileInputStreamます。これは、オブジェクトへの最後の参照を失った後にいつでも発生する可能性がありますが、メモリの状態によってはまったく発生しないこともあります。

Java 7 を使用している場合は、try with resourcesコンストラクトを使用できcloseます。

try (FileInputStream fis = new FileInputStream(filename1);
     InputStreamReader isr = new InputStreamReader(fis, "UTF8");
     BufferedReader br = new BufferedReader(isr)) {
    // Code...
}
于 2014-01-07T09:45:19.933 に答える