2

もしも

FileInputStream fileIS = new FileInputStream(filePathStr);
DataInputStream dataIS = new DataInputStream(fileIS);

dataIS は fileIS を伝播するため、fileIS を閉じると自動的に dataISが閉じられますか、それとも dataIS も個別に閉じる必要がありますか?

ありがとう

4

4 に答える 4

6

選択できる場合は、 のみを閉じる必要がありますDataInputStream。より一般的には、常に最も外側のラッパー ストリームを閉じます。閉鎖は内側に伝播し、これが一般的に正しい動作を保証する唯一の方法です。

ただし、基になる を閉じると、それ自体はシステム リソースを取得しないFileInputStreamため、それで十分です。DataInputStream

あなたの質問に対する最も直接的な答え: いいえ、基になるストリームを閉じてもラッパー ストリームは閉じられませんが、実際には、システム リソース リークの観点からは無関係です。下部のストリームのみが実際のシステム リソースに結合されます。

于 2012-10-12T20:18:24.083 に答える
2

逆を行う必要があります。DataInputStream は FileInputStream をラップするため、これを閉じる必要があります。これにより、FileInputStream も閉じられます。

于 2012-10-12T20:19:38.757 に答える
2

実装は、内部ストリームを閉じる処理を行います。最も外側のストリームを閉じます。そうしないと、たとえば BufferedOutputStream を使用して最初に OutputStream を閉じるときに問題が発生する可能性があります。バッファ内に残っているデータを書き込むことができず、失われます。

于 2012-10-12T20:22:37.207 に答える
0

DataInputStream は FilterInputStream を拡張し、それ自体は close() をまったく実装しないため、継承されます。あなたが求めている動作は、FilterInputStream.close() の契約で明示的に指定されているため、DataInputStream は、FilterInputStream の他のすべての派生クラスに従う必要があります。FilterOutputStream、FilterReader、および FilterWriter の派生クラスについても同様です。

于 2012-10-13T01:15:40.193 に答える