「また私です。」

「こんにちは、エリー!」

「今日はBufferedReaderBufferedWriterについて説明したいと思います。」

「それらについてはすでに話しました。実際にはそれほど複雑ではありません。」

「わかりました。それでは、 BufferedReader がどのように機能するのか教えてください。」

BufferedReader は110/220V コンバーターのようなものです。」

「データの読み取り元となるReaderオブジェクトをBufferedReaderコンストラクターに渡す必要があります。BufferedReaderオブジェクトは、 Readerから大きなデータの塊を読み取り、それらを内部のバッファーに格納します。そのため、BufferedReader を使用してReaderから読み取る方が高速です」Readerから直接読むよりも。」

「そうです。BufferedWriterはどうですか?」

「それは簡単です。 FileWriter に書き込むとしますデータはすぐにディスクに書き込まれます。少量のデータを頻繁に書き込むと、ディスクに頻繁にアクセスすることになり、プログラムの速度が大幅に低下します。しかし、 BufferedWriterを「コンバータ」として使用すると、書き込み操作がはるかに高速になります。 BufferedWriterに書き込むと、内部バッファにデータが保存されます。バッファがいっぱいになると、データが Writer に書き込まれます。単一の大きなチャンクです。これははるかに高速です。」

「うーん、そのとおりです。でも、何を忘れたのですか?」

「書き込みが完了したら、 BufferedWriterオブジェクトのflash()メソッドを呼び出して、バッファ内に残っているデータを Writer に強制的に送信する必要があります。」

「それで、他には何があるの?」

「他には何がありますか? ああ! バッファがWriterに書き込まれていない限り、データは削除したり置換したりできます。」

「アミーゴ! 感動しました! あなたは専門家ですね! それでは、新しいクラスByteArrayStreamPrintStreamについてお話します 。」

「たとえば、ByteArrayInputStreamByteArrayOutputStreamです。」

「これらのクラスはStringReaderStringWriterに少し似ています。ただし、StringReader は文字列 ( String )から文字 ( char )を読み取りますが、InputStream はバイト配列 ( ByteArray ) からバイトを読み取ります。」

StringWriter は文字 ( char ) を文字列に書き込みますが、ByteArrayOutputStream はバイトを内部バイト配列に書き込みます。StringWriterに書き込むと、その内部文字列は長くなり、 ByteArrayOutputStreamに書き込むと、その内部バイト配列も動的に拡張されます。

「前回のレッスンで出た例を思い出してください。」

リーダー オブジェクトからの読み取りとライター オブジェクトへの書き込み:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 StringReader reader = new StringReader(test);

 StringWriter writer = new StringWriter();

 executor(reader, writer);

 String result = writer.toString();

 System.out.println("Result: "+ result);
}

public static void executor(Reader reader, Writer writer) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
 String line;
 while ((line = br.readLine()) != null) {
 StringBuilder sb = new StringBuilder(line);
 String newLine = sb.reverse().toString();

 writer.write(newLine);
 }
}

「文字の代わりにバイトを使用して動作した場合は次のようになります。」

InputStream オブジェクトから読み取り、OutputStream オブジェクトに書き込みます。
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 InputStream inputStream = new ByteArrayInputStream(test.getBytes());

 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

 executor(inputStream, outputStream);

 String result = new String(outputStream.toByteArray());
 System.out.println("Result: "+ result);
}

public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception
{
 BufferedInputStream bis = new BufferedInputStream(inputStream);
 while (bis.available() > 0)
 {
  int data = bis.read();
  outputStream.write(data);
 }
}

「すべて上記の例と同じです。ただし、String を ByteArray に、Reader を InputStream に、Writer を OutputStream に置き換えた点が異なります。」

「他の 2 つの手順は、String を ByteArray に変換し、再度変換することだけです。ご覧のとおり、これは非常に簡単に行われます。」

文字列を ByteArray に変換し、再度変換する
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 byte[] array = test.getBytes();

 String result = new String(array);
 System.out.println("Result: "+ result);
}

ByteArrayOutputStream に既に追加されているバイトを取得するには、toByteArray () メソッドを呼び出します。

「ああ。StringReader/StringWriter との類似点は、特にあなたが私に指摘してくれた後では非常に顕著です。エリー、本当に興味深いレッスンをありがとう。」

「そんなに急いでどこへ行くの?まだちょっとしたプレゼントがあるんだ。PrintStream クラスについて話したいんだ。」

「PrintStream? そのクラスについて初めて聞きました。」

「そうです。特に、Java の学習の初日からそれを使用しているという事実を考慮しないのであれば。System.out を覚えていますか? そうですね、System.outはSystemの静的 (クラス) 変数です。クラス、その型は... PrintStream ! これが、これらすべての print、println などのメソッドの由来です。」

「わあ、なんて面白いのでしょう。私はどういうわけか考えたこともありませんでした。もっと教えてください。」

「わかりました。よく聞いてください。PrintStream クラスは、読み取り可能な出力のために発明されました。このクラスは、ほぼ完全に print メソッドと println メソッドで構成されています。この表を見てください。」

メソッド メソッド
void print(boolean b) void println(boolean b)
void print(char c) void println(char c)
void print(int c) void println(int c)
void print(long c) void println(long c)
void print(float c) void println(float c)
void print(double c) void println(double c)
void print(char[] c) void println(char[] c)
void print(String c) void println(String c)
void print(Object obj) void println(Object obj)
void println()
PrintStream format (String format, Object ... args)
PrintStream format (Locale l, String format, Object ... args)

「フォーマット文字列を使用してデータを出力できるように、いくつかのフォーマット方法もあります。例:」

文字列を ByteArray に変換し、再度変換する
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
画面出力:
My name is Kolan. My age is 25.

「はい、覚えています。String クラスの format メソッドについてはすでに学習しました。」

"それは今のところすべてです。"

「ありがとう、エリー」