"Sunt eu din nou."

— Bună, Ellie!

„Astăzi aș dori să vă spun totul despre BufferedReader și BufferedWriter .”

"Mi-ai spus deja despre ele. Chiar nu sunt chiar atât de complicate."

"OK. Atunci spune-mi cum funcționează BufferedReader ."

" BufferedReader este ca un convertor de 110/220V."

„Trebuie să transmiteți constructorului BufferedReader obiectul Reader din care vor fi citite datele. Un obiect BufferedReader citește bucăți mari de date din Reader și le stochează intern într-un buffer. De aceea, folosirea unui BufferedReader pentru a citi dintr-un Reader este mai rapidă. decât să citești direct de la un Cititor .”

"Așa este. Și cum rămâne cu BufferedWriter ?"

„Este simplu. Să presupunem că scriem pe un FileWriter . Datele sunt scrise imediat pe disc. Dacă scriem în mod frecvent fragmente de date, atunci vom lovi foarte mult discul, ceea ce va încetini foarte mult programul. Dar dacă folosim un BufferedWriter ca „convertor”, atunci operația de scriere este mult mai rapidă. Când scrieți într-un BufferedWriter , acesta salvează datele într-un buffer intern. Când buffer-ul este plin, scrie datele în Writer ca o singură bucată mare. Acest lucru este mult mai rapid."

"Hmm. La vedere. Dar ce ai uitat?"

„După ce ați terminat de scris, trebuie să apelați metoda flush() pe obiectul BufferedWriter pentru a-l forța să trimită orice date încă în buffer către Writer .”

"Și ce altceva?"

"Ce altceva? Oh! Atâta timp cât tamponul nu a fost scris în Writer , datele pot fi șterse și/sau înlocuite."

"Amigo! Sunt impresionat! Ești un expert! Ei bine, atunci îți voi spune despre câteva clase noi:  ByteArrayStream și PrintStream ."

„De exemplu, ByteArrayInputStream și ByteArrayOutputStream .”

„Aceste clase sunt un pic ca StringReader și StringWriter . Cu excepția că StringReader citește caractere ( char ) dintr-un șir ( String ), dar InputStream citește octeți dintr-o matrice de octeți ( ByteArray )."

StringWriter scrie caractere ( char ) într-un șir, în timp ce ByteArrayOutputStream scrie octeți într-o matrice internă de octeți. Când scrieți într-un StringWriter , șirul său intern crește, iar când scrieți într-un ByteArrayOutputStream , șirul său intern de octeți se extinde dinamic.

„Amintiți-vă de exemplul care vi s-a dat în ultima lecție:”

Citirea de la obiectul cititor și scrierea în obiectul 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);
 }
}

„Iată cum ar arăta dacă ar funcționa folosind octeți în loc de caractere:”

Citirea dintr-un obiect InputStream și scrierea într-un obiect 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);
 }
}

"Totul este la fel ca în exemplul de mai sus. Cu excepția faptului că am înlocuit String cu ByteArray, Reader cu InputStream și Writer cu OutputStream."

„Singurii alți doi pași sunt conversia String-ului într-un ByteArray și înapoi din nou. După cum puteți vedea, acest lucru se face destul de ușor:”

Conversia unui șir într-un ByteArray și înapoi din nou
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);
}

„Pentru a obține octeții care au fost deja adăugați la un ByteArrayOutputStream, apelați metoda toByteArray ()”.

"Ah. Asemănările cu StringReader/StringWriter sunt destul de puternice, mai ales după ce mi le-ai subliniat. Mulțumesc, Ellie, pentru o lecție cu adevărat interesantă."

"Unde pleci atât de grăbit? Mai am un mic cadou pentru tine. Vreau să-ți povestesc despre cursul PrintStream."

„PrintStream? E prima dată când aud de această clasă.”

„Da. Mai ales, dacă nu iei în calcul faptul că l-ai folosit din prima zi a studiilor tale Java. Îți amintești System.out ? Ei bine, System.out este o variabilă statică (de clasă) a System. clasa, iar tipul ei este... PrintStream ! De aici provin toate aceste metode print, println etc.."

"Uau. Ce interesant. Cumva nici măcar nu m-am gândit la asta. Spune-mi mai multe."

"Bine. Bine, ascultă. Clasa PrintStream a fost inventată pentru rezultate lizibile. Constă aproape în întregime din metode print și println. Privește acest tabel:"

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

„Există și mai multe metode de formatare, astfel încât să puteți scoate date folosind un șir de format. De exemplu:”

Conversia unui șir într-un ByteArray și înapoi din nou
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
Ieșire ecran:
My name is Kolan. My age is 25.

"Da, îmi amintesc. Am studiat deja metoda de formatare a clasei String."

"Asta este tot pentru acum."

— Mulțumesc, Ellie.