もしも
FileInputStream fileIS = new FileInputStream(filePathStr);
DataInputStream dataIS = new DataInputStream(fileIS);
dataIS は fileIS を伝播するため、fileIS を閉じると自動的に dataISが閉じられますか、それとも dataIS も個別に閉じる必要がありますか?
ありがとう
選択できる場合は、 のみを閉じる必要がありますDataInputStream
。より一般的には、常に最も外側のラッパー ストリームを閉じます。閉鎖は内側に伝播し、これが一般的に正しい動作を保証する唯一の方法です。
ただし、基になる を閉じると、それ自体はシステム リソースを取得しないFileInputStream
ため、それで十分です。DataInputStream
あなたの質問に対する最も直接的な答え: いいえ、基になるストリームを閉じてもラッパー ストリームは閉じられませんが、実際には、システム リソース リークの観点からは無関係です。下部のストリームのみが実際のシステム リソースに結合されます。
逆を行う必要があります。DataInputStream は FileInputStream をラップするため、これを閉じる必要があります。これにより、FileInputStream も閉じられます。
実装は、内部ストリームを閉じる処理を行います。最も外側のストリームを閉じます。そうしないと、たとえば BufferedOutputStream を使用して最初に OutputStream を閉じるときに問題が発生する可能性があります。バッファ内に残っているデータを書き込むことができず、失われます。
DataInputStream は FilterInputStream を拡張し、それ自体は close() をまったく実装しないため、継承されます。あなたが求めている動作は、FilterInputStream.close() の契約で明示的に指定されているため、DataInputStream は、FilterInputStream の他のすべての派生クラスに従う必要があります。FilterOutputStream、FilterReader、および FilterWriter の派生クラスについても同様です。