"To znowu ja."

"Cześć, Ellie!"

„Dzisiaj chciałbym opowiedzieć wam wszystko o BufferedReader i BufferedWriter ”.

- Już mi o nich opowiadałeś. Naprawdę nie są takie skomplikowane.

„OK. W takim razie powiedz mi, jak działa BufferedReader ”.

" BufferedReader jest jak konwerter 110/220V."

„Musisz przekazać konstruktorowi BufferedReader obiekt Reader , z którego będą odczytywane dane. Obiekt BufferedReader odczytuje duże porcje danych z czytnika i przechowuje je wewnętrznie w buforze. Dlatego użycie BufferedReader do odczytu z czytnika jest szybsze niż czytanie bezpośrednio od Czytelnika ”.

„Zgadza się. A co z BufferedWriter ?”

„To bułka z masłem. Załóżmy, że piszemy do FileWriter . Dane są natychmiast zapisywane na dysku. Jeśli często zapisujemy małe bity danych, często uderzamy w dysk, co znacznie spowalnia program. Ale jeśli użyjemy BufferedWriter jako „konwertera", operacja zapisu jest znacznie szybsza. Kiedy piszesz do BufferedWriter , zapisuje dane w wewnętrznym buforze. Kiedy bufor jest pełny, zapisuje dane do Writer jako jeden duży fragment. To jest znacznie szybsze”.

„Hmm. Słusznie. Ale o czym zapomniałeś?”

„Po zakończeniu pisania musisz wywołać metodę flush() na obiekcie BufferedWriter , aby zmusić go do wysłania danych znajdujących się jeszcze w buforze do obiektu Writer ”.

"I co jeszcze?"

„Co jeszcze? Och! Dopóki bufor nie został zapisany do Pisarza , dane mogą zostać usunięte i/lub zastąpione”.

"Amigo! Jestem pod wrażeniem! Jesteś ekspertem! W takim razie opowiem ci o kilku nowych klasach:  ByteArrayStream i PrintStream ."

„Na przykład ByteArrayInputStream i ByteArrayOutputStream ”.

„Te klasy są trochę jak StringReader i StringWriter . Z wyjątkiem tego, że StringReader odczytuje znaki ( char ) z ciągu znaków ( String ), ale InputStream odczytuje bajty z tablicy bajtów ( ByteArray ).”

StringWriter zapisuje znaki ( char ) do łańcucha, podczas gdy ByteArrayOutputStream zapisuje bajty do wewnętrznej tablicy bajtów. Kiedy piszesz do StringWriter , jego wewnętrzny łańcuch wydłuża się, a kiedy piszesz do ByteArrayOutputStream , jego wewnętrzna tablica bajtów również rozwija się dynamicznie.

„Pamiętaj przykład, który otrzymałeś na ostatniej lekcji:”

Czytanie z obiektu czytelnika i pisanie do obiektu pisarza:
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);
 }
}

„Oto, jak by to wyglądało, gdyby działało przy użyciu bajtów zamiast znaków:”

Odczyt z obiektu InputStream i zapis do obiektu 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);
 }
}

„Wszystko jest takie samo, jak w powyższym przykładzie. Z tą różnicą, że zamieniliśmy String na ByteArray, Reader na InputStream i Writer na OutputStream”.

„Jedyne dwa inne kroki to konwersja ciągu znaków na obiekt ByteArray iz powrotem. Jak widać, można to zrobić dość łatwo:”

Konwersja ciągu znaków na ByteArray iz powrotem
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);
}

„Aby pobrać bajty, które zostały już dodane do obiektu ByteArrayOutputStream, wywołaj metodę toByteArray ()”.

„Ach. Podobieństwa do StringReader/StringWriter są dość duże, zwłaszcza po tym, jak mi je wskazałeś. Dziękuję, Ellie, za naprawdę interesującą lekcję”.

„Dokąd tak się śpieszysz? Nadal mam dla ciebie mały prezent. Chcę ci opowiedzieć o zajęciach PrintStream”.

„PrintStream? Pierwszy raz słyszę o takich zajęciach”.

„Tak. Szczególnie, jeśli nie liczyć faktu, że używasz go od pierwszego dnia studiów w Javie. Pamiętasz System.out ? Cóż, System.out jest statyczną (klasową) zmienną klasy System class, a jej typem jest... PrintStream ! Stąd biorą się wszystkie metody print, println itp.".

„Wow. Jakie to interesujące. Jakoś nigdy tego nie brałem pod uwagę. Opowiedz mi więcej”.

„Dobrze. Dobra, posłuchaj. Klasa PrintStream została wymyślona z myślą o czytelnym wyjściu. Składa się prawie wyłącznie z metod print i println. Spójrz na tę tabelę:”

Metody Metody
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)

„Istnieje również kilka metod formatowania, dzięki którym można wyprowadzać dane za pomocą ciągu formatującego. Na przykład:”

Konwersja ciągu znaków na ByteArray iz powrotem
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
Wyjście ekranu:
My name is Kolan. My age is 25.

„Tak, pamiętam. Przestudiowaliśmy już metodę formatowania klasy String”.

"To wszystko na teraz."

– Dzięki, Ellie.