"Det er mig igen."

"Hej, Ellie!"

"I dag vil jeg gerne fortælle dig alt om BufferedReader og BufferedWriter ."

"Du har allerede fortalt mig om dem. De er virkelig ikke så komplicerede."

"OK. Så fortæl mig, hvordan BufferedReader virker."

" BufferedReader er som en 110/220V konverter."

"Du skal videregive Reader- objektet, som data vil blive læst fra til BufferedReader- konstruktøren . Et BufferedReader- objekt læser store bidder af data fra Reader og gemmer dem internt i en buffer. Det er derfor, at det er hurtigere at bruge en BufferedReader til at læse fra en Reader . end at læse direkte fra en læser ."

"Det er rigtigt. Og hvad med BufferedWriter ?"

"Det er et stykke kage. Antag, at vi skriver til en FileWriter . Dataene skrives til disken med det samme. Hvis vi ofte skriver små stykker data, så rammer vi disken meget, hvilket vil bremse programmet meget. Men hvis vi bruger en BufferedWriter som 'konverter', så er skriveoperationen meget hurtigere. Når du skriver til en BufferedWriter , gemmer den dataene i en intern buffer. Når bufferen er fuld, skriver den dataene til Writer som en enkelt stor del. Dette er meget hurtigere."

"Hmm. Spot on. Men hvad har du glemt?"

"Når du er færdig med at skrive, skal du kalde flush() -metoden på BufferedWriter- objektet for at tvinge det til at sende data, der stadig er i bufferen, til Writer . "

"Og hvad ellers?"

"Hvad ellers? Åh! Så længe bufferen ikke er blevet skrevet til forfatteren , kan dataene slettes og/eller erstattes."

"Amigo! Jeg er imponeret! Du er en ekspert! Nå, så vil jeg fortælle dig om nogle nye klasser:  ByteArrayStream og PrintStream ."

"For eksempel ByteArrayInputStream og ByteArrayOutputStream ."

"Disse klasser minder lidt om StringReader og StringWriter . Bortset fra at StringReader læser tegn ( char ) fra en streng ( String ), men InputStream læser bytes fra en byte-array ( ByteArray )."

StringWriter skriver tegn ( char ) til en streng, mens ByteArrayOutputStream skriver bytes til en intern byte-array. Når du skriver til en StringWriter , bliver dens interne streng længere, og når du skriver til en ByteArrayOutputStream udvides dens interne byte-array også dynamisk.

"Husk det eksempel, du fik i sidste lektion:"

Læsning fra læserobjektet og skrivning til forfatterobjektet:
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);
 }
}

"Sådan ville det se ud, hvis det fungerede ved at bruge bytes i stedet for tegn:"

Læsning fra et InputStream-objekt og skrivning til et OutputStream-objekt:
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);
 }
}

"Alt er det samme som i eksemplet ovenfor. Bortset fra, at vi erstattede String med ByteArray, Reader med InputStream og Writer med OutputStream."

"De eneste to andre trin er at konvertere strengen til en ByteArray og tilbage igen. Som du kan se, gøres dette ret nemt:"

Konvertering af en streng til en ByteArray og tilbage igen
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);
}

"For at få de bytes, der allerede er blevet tilføjet til en ByteArrayOutputStream, skal du kalde metoden toByteArray ()."

"Ah. Lighederne med StringReader/StringWriter er ret stærke, især efter du gjorde mig opmærksom på dem. Tak, Ellie, for en virkelig interessant lektion."

"Hvor skal du hen i sådan en fart? Jeg har stadig en lille gave til dig. Jeg vil gerne fortælle dig om PrintStream-klassen."

"PrintStream? Det er første gang, jeg har hørt om den klasse."

"Jep. Især hvis du ikke tæller det faktum med, at du har brugt det siden dag et af dine Java-studier. Kan du huske System.out ? Tja, System.out er en statisk (klasse) variabel i systemet klasse, og dens type er... PrintStream ! Det er her alle disse print-, println-, osv.-metoder stammer fra."

"Wow. Hvor interessant. Jeg har på en eller anden måde aldrig selv overvejet det. Fortæl mig mere."

"Godt. Okay, hør efter. PrintStream-klassen blev opfundet til læsbart output. Den består næsten udelukkende af print- og println-metoder. Se på denne tabel:"

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

"Der er også flere formateringsmetoder, så du kan udlæse data ved hjælp af en formatstreng. For eksempel:"

Konvertering af en streng til en ByteArray og tilbage igen
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
Skærmudgang:
My name is Kolan. My age is 25.

"Ja, jeg kan huske. Vi har allerede studeret String-klassens formatmetode."

"Det er alt for nu."

"Tak, Ellie."