2

MyOpenedFile が、開かれたストリームでファイルをラップするものであると想像してください。次に、次のコードを想定します。

// method in an Util class
static void safeClose(MyOpenedFile f) {
  if (f != null) {
    try {
      f.close();
    } catch(IOException ex) { /* add logging or console output */ }
  }
}

質問の実際の方法:

void doSomeFileOperation(...) throws IOException, ... {
    MyOpenedFile f1 = null;
    MyOpenedFile f2 = null;
    try {

      /* method's "business logic" code beings */
      f1 = new MyOpenedFile(...);
      //do stuff
      f2 = new MyOpenedFile(...);
      // do stuff
      f1.close(); f1 = null;
      // do stuff with f1 closed
      f2.close(); f2 = null;
      // do stuff with f2 closed
      /* method's "business logic" code ends */

    } finally {
      Util.safeClose(f1); f1 = null;
      Util.safeClose(f2); f2 = null; 
    }
}

現在、これは非常に面倒で、特にエラーが発生しやすくなっています (たとえば、finally ブロック内の一部のコードは、単体テストで呼び出すのが非常に難しい場合があります)。たとえば、C++ では、デストラクタがクリーンアップ (スコープ付きポインタ デストラクタによって呼び出されるか直接呼び出されるかのいずれか) を処理し、コードははるかにクリーンになります。

それで、ビジネスロジックコードの上にラップするためのより良い/より良い/よりクリーンな方法はありますf1f2?

また、素敵なラッパーを提供する Apache Commons などのオープン ソース ライブラリを指す回答も歓迎します。

4

4 に答える 4

4

ファイルは、存在する場合も存在しない場合もあるファイル名を含む文字列のラッパーです。ステートレスなので、閉じる必要はありません。

閉じる必要があるリソースは FileInputStream または BufferedReader であり、これらは Java 7 の ARM で暗黙的に閉じることができます

try(BufferedReader br = new BufferedReader(new FileReader(file))) {

}

これはbr、ブロックが終了すると閉じます。

http://www.oracle.com/technetwork/articles/java/trywithresources-401775.html

于 2012-11-01T10:28:02.277 に答える
1

try-with-resources ステートメントを見てください。これは、try ブロックの終了後にリソースを閉じます。

使用しているFileクラスはメソッドjava.io.Fileがないためないようですclose()。その場合、独自のFileクラスCloseableが ARM で動作するように実装されていることを確認してください。

try (FileInputStream f1 = new FileInputStream("test1.txt");
     FileInputStream f2 = new FileInputStream("test2.txt")) {
    // Some code
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
于 2012-11-01T10:27:48.877 に答える
1

ここで説明されているように、ファイル (ファイル システム上のファイルの表現) を閉じる必要はありません。

File.getName() を実行したファイルを閉じる必要がありますか?

ファイルストリーム/リーダーについてもっと質問していると思いますか?

その場合、Java 7 には素晴らしい新機能があります: http://www.vineetmanohar.com/2011/03/java-7-try-with-auto-closable-resources/

古いバージョンの Java を使用している場合は、次のようにシンプルにします。

void doSomeFileOperation(...) throws IOException, ... {
  FileInputStream f1 = null;
  FileInputStream f2 = null;
  try {

    // do stuff

  } finally {
    Util.safeClose(f1); 
    Util.safeClose(f2); 
  }
}
于 2012-11-01T10:28:02.323 に答える
0

私の頭に自動的に浮かぶオプションは次のとおりです。ファイルを処理するコードを、処理を行うコードから分離します。このようにして、open、close、および例外処理を処理する厄介なコードをカプセル化できます。

他のビットは、あなたが持っているサンプルが多くの余分な不要なステップを実行することです

void doSomeFileOperation(...) throws IOException, ... {
    File f1 = null;
    File f2 = null;
    try {
      f1 = new File(...);
      f2 = new File(...);
      // callback to another class / method that does the real work
    } finally {
      Util.safeClose(f1);
      Util.safeClose(f2);
    }
}

File インスタンスを null に設定する必要はありません。それらを使用しようとすると、例外が発生します。

どのFileオブジェクトを使用しているのか気になります。Javaの標準Fileクラスにはメソッドがありませんclose()

于 2012-11-01T10:25:57.270 に答える