"Hej, Amigo!"

"Hej, Ellie!"

"I dag vil jeg fortælle dig om klasserne StringReader og StringWriter . I princippet vil der ikke være meget nyt for dig, men nogle gange er disse klasser meget nyttige. Men i det mindste vil jeg have dig til at vide at de eksisterer."

"Disse klasser er de enkleste implementeringer af de abstrakte Reader- og Writer-klasser. Og de ligner grundlæggende FileReader og FileWriter. Men i modsætning til dem fungerer disse ikke med data i en fil på disken. I stedet arbejder de med en streng i JVM's hukommelse."

"Hvorfor skulle vi have brug for sådanne klasser?"

"Nogle gange er der brug for dem. StringReader er i bund og grund en adapter mellem String- og Reader- klasserne. Og StringWriter er en String, der arver Writer . Ja... Jeg kan se, at det ikke er den bedste forklaring. Det vil være bedre at se på et par eksempler først."

"Antag for eksempel, at du vil teste din metode, som læser data fra Reader-objektet, der er sendt til det. Vi kunne gøre det sådan her:"

Læsning fra et Reader-objekt:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";

 // This line is key: we "convert" the String into a Reader.
 StringReader reader = new StringReader(test);

 executor(reader);
}

public static void executor(Reader reader) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
 String line;
 while (line = br.readLine() != null)
 {
 System.out.println(line);
 }
}

"Med andre ord, vi tog simpelthen en streng, pakkede den ind i en StringReader og sendte den så i stedet for et Reader-objekt? Og alt vil blive læst fra den, som vi har brug for?"

"Jep. Hmm. Og der er en mening med dette. Lad os nu teste StringWriter-metoderne. For at gøre dette vil vi gøre eksemplet mere kompliceret. Nu vil den ikke bare læse linjerne og vise dem på skærmen, i stedet for det vil vende dem og sende dem til writer-objektet. For eksempel:"

Læsning fra læserobjektet og skrivning til forfatterobjektet:
public static void main (String[] args) throws Exception
{
 // The Reader must read this String.
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";

 // Wrap the String in a StringReader.
 StringReader reader = new StringReader(test);

 // Create a StringWriter object.
 StringWriter writer = new StringWriter();

 // Copy strings from the Reader to the Writer, after first reversing them.
 executor(reader, writer);

 // Get the text that was written to the Writer.
 String result = writer.toString();

 // Display the text from the Writer on the screen.
 System.out.println("Result: "+ result);
}

public static void executor(Reader reader, Writer writer) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
String line;

 // Read a string from the Reader.
while (line = br.readLine()) != null)
 {

 // Reverse the string.
  StringBuilder sb = new StringBuilder(line);
  String newLine = sb.reverse().toString();

 // Write the string to the Writer.
  writer.write(newLine);
 }
}

"Vi har oprettet et StringWriter- objekt, der indeholder en streng, der gemmer alt, der er skrevet til denne forfatter . Og for at få det, skal du blot kalde toString ()-metoden."

"Hmm. På en eller anden måde virker det hele for nemt. Eksekveringsmetoden fungerer med læse- og forfatterstrømobjekter , men vi arbejder med strenge i hovedmetoden.

"Er det hele virkelig så enkelt?"

"Jep. For at konvertere en streng til en læser skal du bare skrive dette:"

Oprettelse af en læser fra en streng
String s = "data";
Reader reader = new StringReader(s);

"Og det er endnu nemmere at konvertere en StringWriter til en String:"

Få en streng fra en forfatter
Writer writer = new StringWriter();
/* Here we write a bunch of data to the writer */
String result = writer.toString();

"Det er fremragende klasser, efter min mening. Tak, fordi du fortalte mig om dem, Ellie."