1.OutputStreamクラス

私たちはつい最近、入力ストリームを調査しました。出力ストリームについて話しましょう。

このOutputStreamクラスは、バイト出力をサポートするすべてのクラスの親クラスです。これはそれ自体では何もしない抽象クラスですが、あらゆる場面に対応する子孫クラスを持っています。

非常に複雑に聞こえます。より簡単に言うと、このクラスは文字やその他のデータ型ではなく、バイトを操作します。そして、それが抽象であるという事実は、通常はそれを使用せず、その子孫クラスの 1 つを使用することを意味します。例えば、FileOutputStreamなど。

しかし、クラスに戻りますOutputStream。このクラスには、そのすべての子孫クラスが実装する必要があるメソッドがあります。主なものは次のとおりです。

メソッド 説明
void write(int b)
intストリームに1 バイト (バイトではなく) を書き込みます。
void write(byte[] buffer)
バイト配列をストリームに書き込みます
void write(byte[] buffer, off, len)
バイト配列の一部をストリームに書き込みます
void flush()
バッファに格納されているすべてのデータをストリームに書き込みます
void close()
ストリームを閉じます

を継承するクラスのオブジェクトを作成するときは、通常、 がデータを読み取るInputStreamソース オブジェクトを指定します。InputStreamを継承するクラスのオブジェクトを作成するときはOutputStream、通常、データが書き込まれるターゲット オブジェクトまたはストリームも指定します。

クラスのすべてのメソッドを簡単に見てみましょうOutputStream

write(int b)方法

このメソッドは、int出力ストリームに 1 バイト (バイトではなく) を書き込みます。渡された値はバイトにキャストされ、int の最初の 3 バイトは破棄されます。

write(byte[] buffer)方法

指定されたバイト配列を出力ストリームに書き込みます。それでおしまい。

write(byte[] buffer, int offset, int length)方法

渡されたバイト配列の一部を出力ストリームに書き込みます。オフセット変数は配列の最初の要素のインデックスを示し、length書き込まれるサブセットの長さになります。

flush()方法

このflush()メソッドは、現在のストリームにバッファリングされている可能性のあるデータを強制的にターゲット ストリームに書き込むために使用されます。これは、バッファリングやチェーンに配置された複数のストリーム オブジェクトを使用する場合に関係します。

close()方法

未書き込みのデータをターゲット オブジェクトに書き込みます。ブロックを使用する場合、メソッドclose()を呼び出す必要はありませんtry-with-resources

ファイルのコピー例

コード ノート
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamファイルからの読み取り用 ファイル
OutputStreamへの書き込み

用 データを読み取るバッファー
ストリームにデータがある限り

データをバッファーに読み取る
データをバッファーから 2 番目のストリームに書き込む

2.Writerクラス

このWriterクラスは クラスとまったく同じですOutputStreamが、もう一度違う点が 1 つだけあります。それは、charバイトではなく文字 ( ) を処理することです。

これは抽象クラスです。このWriterクラスのオブジェクトを作成することはできません。その主な目標は、何百もの子孫クラスの共通の親クラスとなり、文字ストリームを操作するための共通のメソッドをそれらのクラスに提供することです。

Writerクラス (およびそのすべての子孫クラス)のメソッド:

メソッド 説明
void write(int b)
intストリームに1 文字 ( ではない) を書き込みます。
void write(char[] buffer)
文字の配列をストリームに書き込みます
void write(char[] buffer, off, len)
文字の配列の一部をストリームに書き込みます
void write(String str)
ストリームに文字列を書き込みます
void write(String str, off, len)
文字列の一部をストリームに書き込みます
void flush()
バッファに格納されているすべてのデータをストリームに書き込みます
void close()
ストリームを閉じます

これらのメソッドはクラスのメソッドとよく似ていますOutputStreamが、バイトではなく文字を処理します。

メソッドの説明:

write(int b)方法

このメソッドは、単一の文字 ( char— ではなくint) を出力ストリームに書き込みます。渡された値は a にキャストされchar、最初の 2 バイトは破棄されます。

write(char[] buffer)方法

指定された文字の配列を出力ストリームに書き込みます。

write(char[] buffer, int offset, int length)方法

渡された文字配列の一部を出力ストリームに書き込みます。変数offsetは配列の最初の要素のインデックスを示し、length書き込まれるサブセットの長さになります。

write(String str)方法

指定された文字列を出力ストリームに書き込みます。

write(String str, int offset, int length)方法

指定された文字列の一部を出力ストリームに書き込みます。文字列は文字の配列に変換されます。変数offsetは配列の最初の要素のインデックスを示し、length書き込まれるサブセットの長さになります。

flush()方法

このflush()メソッドは、現在のストリームにバッファリングされている可能性のあるデータを強制的にターゲット ストリームに書き込むために使用されます。これは、バッファリングやチェーンに配置された複数のストリーム オブジェクトを使用する場合に関係します。

close()方法

未書き込みのデータをターゲット オブジェクトに書き込みます。ブロックを使用する場合、メソッドclose()を呼び出す必要はありませんtry-with-resources

テキスト ファイルをコピーするプログラムの例:

コード ノート
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerファイルからの
Writer読み取り用 ファイルへの書き込み用

データを読み取るバッファー
ストリーム内にデータがある限り

データをバッファーに読み取る
データをバッファーから 2 番目のストリームに書き込む

StringWriterクラス

このクラスを継承する別の興味深いクラスがありますWriter。それは と呼ばれますStringWriter。これには、変更可能な文字列、つまりStringBufferオブジェクトが含まれています。そして、オブジェクトに何かを「書き込む」たびにStringWriter、テキストが内部バッファに追加されるだけです。

例:

コード ノート
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
ターゲットの文字ストリーム ( StringWriter) が作成されます。
文字列が内部のバッファに書き込まれます。StringWriter
文字列が内部のバッファに書き込まれます。StringWriter

オブジェクトの内容を文字列に変換します。

この場合、StringWriterクラスは本質的にクラスのラッパーですStringBufferが、StringWriterクラスはストリーム クラスの子孫でありWriter、ストリーム オブジェクトのチェーンで使用できます。これは実際には非常に便利なプロパティです。