"Olá, amigo!"

"Oi, Ellie!"

"Hoje quero falar sobre as classes StringReader e StringWriter . Em princípio, não haverá muita novidade para você, mas às vezes essas classes são muito úteis. Mas, no mínimo, quero que você saiba que eles existem."

"Essas classes são as implementações mais simples das classes abstratas Reader e Writer. E são basicamente semelhantes a FileReader e FileWriter. No entanto, ao contrário dessas, elas não funcionam com dados em um arquivo em disco. Em vez disso, elas trabalham com uma String na memória da JVM."

"Por que precisaríamos de tais classes?"

"Às vezes eles são necessários. Essencialmente, StringReader é um adaptador entre as classes String e Reader . E StringWriter é uma String que herda Writer . Sim... posso dizer que essa não é a melhor explicação. Será melhor dar uma olhada em algumas de exemplos primeiro."

"Por exemplo, suponha que você queira testar seu método, que lê dados do objeto Reader passado para ele. Poderíamos fazer assim:"

Lendo de um objeto Reader:
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);
 }
}

"Em outras palavras, nós simplesmente pegamos um String, o envolvemos em um StringReader e o passamos em vez de um objeto Reader? E tudo será lido dele como precisamos?"

"Sim. Hmm. E há um ponto para isso. Agora vamos testar os métodos de StringWriter. Para fazer isso, vamos tornar o exemplo mais complicado. Agora ele não irá simplesmente ler as linhas e exibi-las na tela, em vez disso ele irá revertê-los e enviá-los para o objeto gravador. Por exemplo:"

Lendo do objeto leitor e escrevendo para o objeto escritor:
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);
 }
}

"Criamos um objeto StringWriter que contém uma string que armazena tudo o que é escrito neste gravador . E para obtê-lo, basta chamar o método toString ()."

"Hmm. De alguma forma, tudo parece muito fácil. O método executor funciona com os objetos de fluxo do leitor e do gravador , mas estamos trabalhando com strings no método principal.

"É tudo tão simples assim?"

"Sim. Para converter uma String em um Reader , basta escrever isto:"

Criando um leitor a partir de uma string
String s = "data";
Reader reader = new StringReader(s);

"E converter um StringWriter em um String é ainda mais fácil:"

Obtendo uma String de um Writer
Writer writer = new StringWriter();
/* Here we write a bunch of data to the writer */
String result = writer.toString();

"Estas são aulas excelentes, na minha opinião. Obrigado por me contar sobre elas, Ellie."