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、ストリーム オブジェクトのチェーンで使用できます。これは実際には非常に便利なプロパティです。



3.PrintStreamクラス

出力ストリーム クラスは、渡されたターゲット ストリームにデータを書き込む中間ストリームとのチェーンに配置することもできます。これらのストリームの相互作用の全体像は次のようになります。

PrintStreamクラス

すべての中間出力ストリームの中で最も興味深く多用途なストリームは ですPrintStream。数十のメソッドと 12 ものコンストラクターがあります。

クラスPrintStreamは を継承しFilterOutputStream、そのクラスは を継承しますOutputStream。これは、クラスが独自のメソッドに加えて、親クラスのすべてのメソッドをPrintStream持っていることを意味します。最も興味深いものは次のとおりです。

メソッド 説明
void print(obj)
渡されたオブジェクトを文字列に変換し、ターゲット ストリームに出力します。
void println(obj)
渡されたオブジェクトを文字列に変換し、ターゲット ストリームに出力します。最後に改行を追加します
void println()
対象ストリームに改行文字を出力します。
PrintStream format(String format, args...)
フォーマット文字列と渡された引数に基づいて文字列を構築して出力します。String.format()方法に似ています

では、これらの数十のメソッドはどこにあるのでしょうか?

print()そうですね、さまざまなパラメーターを備えたおよびメソッドのバリアントが多数ありますprintln()。それらは次の表にまとめられます。

これらの方法についてはすでによく知っているので、ここでは詳しく説明しません。私が何を言いたいのかわかりますか?

覚えていますSystem.out.println()か?ただし、次の 2 行で書くことができます。

コード コンソール出力
PrintStream stream = System.out;
stream.println("Hello!");
Hello!

私たちのお気に入りのコマンドは、クラスの静的変数のメソッドの呼び出しです。そして、この変数の型は です。System.out.println()println()outSystemPrintStream

PrintStreamCodeGym の多くのレベル、およびほぼすべてのタスクで、あなたは知らないうちにクラスのメソッドを呼び出しています。

実用

Java には、 という興味深いクラスがありますByteArrayOutputStream。これは、 を継承し、動的に増加するバイト配列ですOutputStream

オブジェクトByteArrayOutputStreamPrintStreamオブジェクトは次のようにチェーンできます。

コード 説明
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try(PrintStream stream = new PrintStream(baos))
{
   stream.println("Hello");
   stream.println(123);
}

String result = baos.toString();

System.out.println(result);
メモリ内に書き込みバッファを作成します。

バッファをPrintStreamオブジェクトにラップします

。 データをコンソールに書き込みます



。 配列を文字列に変換します。

コンソール出力:
Hello!
123