2

私のアプリは次のことを行う必要があります。

  • を開き、基になるものを ( 経由で)FileInputStream取得します。FileDescriptorgetFd()
  • FileInputStream上記に基づいて新しいオブジェクトを作成しますFileDescriptor

これまでのところ、必要なものは 1 つだけだったので、元のストリーム (つまり、呼び出したストリーム)FileDescriptorを呼び出して閉じていました。一部の Android API メソッドにはこのようなパラメーターがあるため、これを使用します。close()getFd()

FileInputStream同時により多くのオブジェクトを取得できるようになりましたが、いつFileDescriptor閉鎖されますか? (私の推測: すべてのFileInputStreamオブジェクトが閉じられたとき?)

4

1 に答える 1

4

私はあなたが正しいと信じています。簡単なテストでは、閉じたFileDescriptor後に が無効になることが示されています。同じ に対してFileInputStream複数の がある場合、最初の が閉じられるとすぐに が無効になることに注意してください。つまり、最初に閉じてから閉じても、またはその逆でもかまいません。FileInputStreamFileDescriptorFileDescriptorFileInputStreamfis1fis2

FileInputStream fis1 = new FileInputStream("/tmp/adb.log");
FileDescriptor fd = fis1.getFD();
FileInputStream fis2 = new FileInputStream(fd);
System.out.println(fd.valid());
fis1.close();
System.out.println(fd.valid());
fis2.close();
System.out.println(fd.valid());

出力は次のとおりです。

true
false
false

finallyI/O (読み取り/書き込み) エラーが発生した場合にもストリームを閉じるように、ブロック内のストリームを閉じることを忘れないでください。

于 2013-06-23T17:36:11.000 に答える