commons-ioのinputstream学習

2264 ワード

ProxyInputStreamクラスの学習
このクラスの設計意図は特に明確ではなく、JDKのFilterInputStreamクラスを継承しているが、そのread(byte[]bytes)という関数もdelegateを呼び出すread(byte[])関数であり、親はread(byte[]bytes,int offset,int length)関数を直接呼び出す.
このクラスはパッケージのdeleteを呼び出すInputStreamと理解できるでしょう.
AutoCloseInputStreamクラスの学習
このクラスの設計意図はクラス名を見ると分かりますが、主に底層のInputStreamを自動的に閉じることです.readメソッドを呼び出すたびに底層のInputStreamを閉じるかどうかを判断します.底層のInputStreamをClosedInputStreamに設定することです.このようなreadメソッドの呼び出しではNPE異常は放出されません.
   public void close() throws IOException {
        in.close();
        in = new ClosedInputStream();
    }
 
このクラスの使用シーンは、読み取りが完了したときにストリームを自動的に閉じ、最下位のリソースを解放するはずです.
ClosedInputStreamクラスの学習
このクラスは実は私たちがその実現を見てみればすべて理解できるはずで、read方法を-1に戻せばいいのです.
  public int read() {
        return -1;
    }
  
CloseShieldInputStreamクラスの学習
このクラスは実はそうではないと底のInputStreamが閉鎖されるので、閉鎖方法を再ロードします.
英語の注釈に書かれている使用シーンを見てみましょう.
This class is typically used in cases where an input stream needs to be
passed to a component that wants to explicitly close the stream even if
more input would still be available to other components.
CountingInputStreamクラスの学習
このクラスは,実際にはクラス名からもその使用意図が見え,読み出したバイト数を統計するものである.
これは多くは言いません.readメソッドは実際に読んだバイト数を返し、クラスに保存することができます.
変数を統計すると、読み込んだバイト数を統計することができます.
DemuxInputStreamクラスの学習
このクラスが分かりやすいのは,現在のThreadLocalから下位層のInputStreamを取得して読み取り操作を行うことである.このクラスの使用シーンも明らかになったが,ある実際にThreadLocalに適切なInputStreamストリームを入れ,このクラスのreadメソッドを呼び出すと,そのクラスはThreadLocalから対応するInputStreamを取得して操作する.
SwappedDataInputStreamクラスの学習
このクラスは実際にデータの変換機能にかかわるので、具体的には以下の注釈を見てみましょう.
    DataInput for systems relying on little endian data formats.
When read, values will be changed from little endian to big 
endian formats for internal usage. 
TeeInputStreamクラスの学習
この類はとてもおもしろくて、実際にそれが完成した仕事は読んだものを最後まで書いて包装したOutputStreamの中に行って、お茶を飲むような感じがして、お茶を1口飲んで、それからお茶を1口飲みます.実はこのクラスには特別なものはありません.それは、読んでから最下位のOutputStreamを直接呼び出してデータを書き、OutputStreamを閉じるかどうかを示すパラメータが必要だと確信しています.
ClassLoaderObjectInputStreamクラスの学習
このクラスはObjectInputStreamを継承しており、resolveClass関数ではObjectStreamClassクラスから動的にロードされるので、このクラスの実装では、このクラスをロードするために使用するclassloaderをコンストラクション関数で指定できます.