"Hej, Amigo!"

"Hej Ellie!"

"Idag vill jag berätta om klasserna StringReader och StringWriter . I princip kommer det inte att finnas mycket nytt för dig, men ibland är dessa klasser väldigt användbara. Men åtminstone vill jag att du ska veta att de finns."

"Dessa klasser är de enklaste implementeringarna av de abstrakta Reader- och Writer-klasserna. Och de liknar i grunden FileReader och FileWriter. Men till skillnad från dem fungerar dessa inte med data i en fil på disk. Istället arbetar de med en sträng i JVM:s minne."

"Varför skulle vi behöva sådana klasser?"

"Ibland behövs de. StringReader är i huvudsak en adapter mellan String- och Reader -klasserna. Och StringWriter är en String som ärver Writer . Ja... Jag kan säga att det inte är den bästa förklaringen. Det är bättre att titta på ett par exempel först."

"Anta till exempel att du vill testa din metod, som läser data från Reader-objektet som skickas till det. Vi skulle kunna göra det så här:"

Läsa från ett 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 andra ord, vi tog helt enkelt en String, lindade in den i en StringReader och skickade sedan det istället för ett Reader-objekt? Och allt kommer att läsas från det som vi behöver?"

"Japp. Hmm. Och det finns en poäng med det här. Låt oss nu testa StringWriters metoder. För att göra detta kommer vi att göra exemplet mer komplicerat. Nu kommer den inte bara att läsa raderna och visa dem på skärmen, istället det kommer att vända dem och mata ut dem till writer-objektet. Till exempel:"

Läsa från läsobjektet och skriva till skribentobjektet:
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 skapade ett StringWriter- objekt som innehåller en sträng som lagrar allt som skrivits till den här författaren . Och för att få det behöver du bara anropa metoden toString ()."

"Hmm. På något sätt verkar det hela för enkelt. Exekveringsmetoden fungerar med läsaren och skribentens strömobjekt , men vi arbetar med strängar i huvudmetoden.

"Är det verkligen så enkelt?"

"Japp. För att konvertera en sträng till en läsare , skriv bara detta:"

Skapa en läsare från en sträng
String s = "data";
Reader reader = new StringReader(s);

"Och att konvertera en StringWriter till en String är ännu enklare:"

Få en sträng från en författare
Writer writer = new StringWriter();
/* Here we write a bunch of data to the writer */
String result = writer.toString();

"Det här är utmärkta klasser, enligt min mening. Tack för att du berättade om dem, Ellie."