"Пак съм аз."

„Здравей, Ели!“

„Днес бих искал да ви разкажа всичко за BufferedReader и BufferedWriter .“

— Вече ми каза за тях. Наистина не са толкова сложни.

„ОК. Тогава ми кажете How работи BufferedReader .“

" BufferedReader е като 110/220V преобразувател."

„Трябва да предадете на конструктора BufferedReader обекта Reader , от който данните ще бъдат прочетени. Обектът BufferedReader чете големи части от данни от Reader и ги съхранява вътрешно в буфер. Ето защо използването на BufferedReader за четене от Reader е по-бързо отколкото четене директно от Reader ."

„Точно така. А Howво да кажем за BufferedWriter ?“

„Това е лесно. Да предположим, че пишем на FileWriter . Данните се записват на диска незабавно. Ако често записваме малки битове данни, тогава ще ударим много диска, което ще забави много програмата. Но ако използваме BufferedWriter като „конвертор", тогава операцията по запис е много по-бърза. Когато пишете в BufferedWriter , той записва данните във вътрешен буфер. Когато буферът е пълен, той записва данните в Writer като едно голямо парче. Това е много по-бързо."

"Хмм. На място. Но Howво си забравил?"

„След като приключите с писането, трябва да извикате метода flush() на обекта BufferedWriter , за да го принудите да изпрати всички данни, които все още са в буфера, към Writer .“

"И Howво друго?"

"Какво друго? О! Докато буферът не е записан в Writer , данните могат да бъдат изтрити и/or заменени."

„Амиго! Впечатлен съм! Вие сте експерт! Е, тогава ще ви разкажа за някои нови класове:  ByteArrayStream и PrintStream .“

"Например ByteArrayInputStream и ByteArrayOutputStream ."

"Тези класове са малко като StringReader и StringWriter . Освен че StringReader чете знаци ( char ) от низ ( String ), но InputStream чете byteове от byteов масив ( ByteArray )."

StringWriter записва знаци ( char ) в низ, докато ByteArrayOutputStream записва byteове във вътрешен byteов масив. Когато пишете в StringWriter , неговият вътрешен низ става по-дълъг, а когато пишете в ByteArrayOutputStream , неговият вътрешен масив от byteове също се разширява динамично.

„Спомнете си примера, който ви беше даден в последния урок:“

Четене от обекта reader и писане в обекта writer:
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);
 }
}

„Ето How би изглеждало, ако работи с byteове instead of знаци:“

Четене от обект 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.“

„Единствените две други стъпки са преобразуването на низа в 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);
}

„За да получите byteовете, които вече са добавени към ByteArrayOutputStream, извикайте метода toByteArray ().“

„А. Прorките със StringReader/StringWriter са доста силни, особено след като ми ги посочи. Благодаря ти, Ели, за наистина интересния урок.“

„Закъде толкова бързаш? Все още имам малък подарък за теб. Искам да ти разкажа за класа PrintStream.“

"PrintStream? За първи път чувам за този клас."

„Да. Особено, ако не броите факта, че го използвате от първия ден на вашето изучаване на Java. Помните ли System.out ? Е, System.out е статична (класова) променлива на System клас и типът му е... PrintStream ! Това е мястото, откъдето произлизат всички тези методи print, println и т.н."

"Уау. Колко интересно. НяHow си дори не съм се замислял за това. Разкажи ми повече."

"Добре. Добре, слушайте. Класът PrintStream е измислен за четим изход. Състои се почти изцяло от методи print и println. Вижте тази table:"

Методи Методи
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.“

"Това е всичко за сега."

— Благодаря, Ели.