"Det er meg igjen."

"Hei, Ellie!"

"I dag vil jeg gjerne fortelle deg alt om BufferedReader og BufferedWriter ."

"Du har allerede fortalt meg om dem. De er egentlig ikke så kompliserte."

"OK. Så fortell meg hvordan BufferedReader fungerer."

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

"Du må sende Reader- objektet som data skal leses fra til BufferedReader- konstruktøren . Et BufferedReader- objekt leser store biter av data fra Reader og lagrer dem internt i en buffer. Det er derfor det går raskere å bruke en BufferedReader til å lese fra en Reader . enn å lese direkte fra en leser ."

"Det stemmer. Og hva med BufferedWriter ?"

"Det er en piece of cake. Anta at vi skriver til en FileWriter . Dataene skrives til disk umiddelbart. Hvis vi skriver små biter av data ofte, vil vi treffe disken mye, noe som vil bremse programmet mye. Men hvis vi bruker en BufferedWriter som en 'konverterer', så er skriveoperasjonen mye raskere. Når du skriver til en BufferedWriter , lagrer den dataene i en intern buffer. Når bufferen er full, skriver den dataene til Writer som en enkelt stor del. Dette er mye raskere."

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

"Etter at du er ferdig med å skrive, må du kalle opp flush() -metoden på BufferedWriter- objektet for å tvinge det til å sende data som fortsatt er i bufferen til Writer ."

"Og hva annet?"

"Hva annet? Å! Så lenge bufferen ikke er skrevet til Writer , kan dataene slettes og/eller erstattes."

"Amigo! Jeg er imponert! Du er en ekspert! Vel, da skal jeg fortelle deg om noen nye klasser:  ByteArrayStream og PrintStream ."

"For eksempel ByteArrayInputStream og ByteArrayOutputStream ."

"Disse klassene er litt som StringReader og StringWriter . Bortsett fra at StringReader leser tegn ( char ) fra en streng ( String ), men InputStream leser byte fra en byte-array ( ByteArray )."

StringWriter skriver tegn ( char ) til en streng, mens ByteArrayOutputStream skriver byte til en intern byte-array. Når du skriver til en StringWriter , vokser dens interne streng lengre, og når du skriver til en ByteArrayOutputStream utvides dens interne byte-array også dynamisk.

"Husk eksempelet du fikk i forrige leksjon:"

Lese fra leserobjektet og skrive 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);
 }
}

"Slik ville det sett ut hvis det fungerte med byte i stedet for tegn:"

Lese fra et InputStream-objekt og skrive 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. Bortsett fra at vi erstattet String med ByteArray, Reader med InputStream og Writer med OutputStream."

"De eneste to andre trinnene er å konvertere strengen til en ByteArray og tilbake igjen. Som du kan se, gjøres dette ganske enkelt:"

Konvertere en streng til en ByteArray og tilbake igjen
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 å få byte som allerede er lagt til en ByteArrayOutputStream, kall toByteArray ()-metoden."

"Ah. Likhetene til StringReader/StringWriter er ganske sterke, spesielt etter at du påpekte dem for meg. Takk, Ellie, for en veldig interessant leksjon."

"Hvor skal du med så travelt? Jeg har fortsatt en liten gave til deg. Jeg vil fortelle deg om PrintStream-klassen."

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

"Jepp. Spesielt hvis du ikke regner med det faktum at du har brukt det siden dag én av Java-studiene dine. Husker du System.out ? Vel, System.out er en statisk (klasse) variabel av systemet klasse, og dens type er... PrintStream ! Det er her alle disse utskrifts-, println-, etc.-metodene stammer fra."

"Wow. Så interessant. Jeg tenkte liksom aldri på det. Fortell meg mer."

"Bra. Ok, hør etter. PrintStream-klassen ble oppfunnet for lesbare utdata. Den består nesten utelukkende av print- og println-metoder. Se på denne tabellen:"

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)

"Det finnes også flere formatmetoder slik at du kan skrive ut data ved hjelp av en formatstreng. For eksempel:"

Konvertere en streng til en ByteArray og tilbake igjen
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
Skjermutgang:
My name is Kolan. My age is 25.

"Ja, jeg husker. Vi har allerede studert String-klassens formatmetode."

"Det er alt for nå."

"Takk, Ellie."