「こんにちは、アミーゴ! 今日は、 InputStreamOutputStream がどのように機能するかをもう一度掘り下げていきます。最初の説明は実際には少し単純すぎました。これらはインターフェイスではありません。これらは抽象クラスであり、実装されたメソッドもいくつかあります。彼らの手法を見てみましょう。」

入力ストリームのメソッド メソッドの内容
int read(byte[] buff);
このメソッドは、バッファーがいっぱいになるか、ソースに読み取るバイトがなくなるまで、バイトのブロックを直ちにバッファー( byte array )に読み取ります。 このメソッドは、実際に読み取られたバイト数を返します (配列の長さよりも小さい場合があります)。
int read();
このメソッドは 1 バイトを読み取り、それを返します。結果は、見た目の int に拡張されます。読み取るバイトがもうない場合、メソッドは -1 を返します。
int available();
このメソッドは、未読の (使用可能な) バイト数を返します。
void close();
このメソッドはストリームを「閉じます」。ストリームの操作が完了したら、これを呼び出します。
その後、オブジェクトはファイルを閉じるなどのハウスキーピング操作を実行します。
この時点では、ストリームからそれ以上データを読み取ることはできません。

「つまり、単一バイトだけでなくブロック全体も読み取ることができるということですか?」

"その通り。"

「ブロック全体を書くこともできますか?」

「はい、チェックしてください:」

OutputStream メソッド メソッドの内容
void write(int c);
このメソッドは 1 バイトを書き込みます。int 型はバイトに絞り込まれます。余分な部分は単純に破棄されます。
void write(byte[] buff);
このメソッドはバイトのブロックを書き込みます。
void write(byte[] buff, int from, int count);
このメソッドはバイトのブロックの一部を書き込みます。これは、バイト配列が完全に埋められていない可能性がある場合に使用されます。
void flush();
ストリームがまだ書き込まれていないデータを内部に保存している場合、このメソッドはそのデータを強制的に書き込みます。
void close();
このメソッドはストリームを「閉じます」。ストリームの操作が完了したら、これを呼び出します。
その後、オブジェクトはファイルを閉じるなどのハウスキーピング操作を実行します。ストリームにデータを書き込むことはできなくなり、flush が自動的に呼び出されます。

「単一バイトではなくブロック全体を一度に読み取ると、ファイルをコピーするコードはどのようになりますか?」

「うーん。次のような感じです。」

ディスク上のファイルをコピーする
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

  byte[] buffer = new byte[1000];
 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  //Read the next block of bytes into buffer, and store the actual number of bytes read in count.
  int count = inputStream.read(buffer);
  outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

「バッファーについてはすべて理解しましたが、このカウント変数は何ですか?」

「ファイルから最新のデータ ブロックを読み取ると、たとえば、1000 バイトではなく 328 バイトが得られる場合があります。そのため、データを書き込むときは、ブロック全体を書き込むのではなく、最初の 328 バイトだけを書き込むことを示す必要があります。バイト。」

最後のブロックを読み取ると、readメソッドは実際に読み取られたバイト数を返します。最後のブロックを除いて、ブロックを読み取るたびに 1000 が返され、328 が返されます。

したがって、ブロックを書き込むときは、バッファ内のすべてのバイトを書き込むのではなく、328 (つまり、count 変数に格納されている値) だけを書き込む必要があることを示します。

「これですべてがクリアになりました。ありがとう、エリー。」