"Cześć, Amigo!"

"Cześć, Ellie!"

„Dzisiaj chcę ci opowiedzieć o klasach StringReader i StringWriter . W zasadzie nie będzie dla ciebie zbyt wiele nowości, ale czasami te klasy są bardzo przydatne. Ale przynajmniej chcę, żebyś wiedział że istnieją”.

„Te klasy są najprostszymi implementacjami abstrakcyjnych klas Reader i Writer. I są zasadniczo podobne do FileReader i FileWriter. Jednak w przeciwieństwie do nich, nie działają one z danymi w pliku na dysku. Zamiast tego działają z ciągiem w pamięci maszyny JVM”.

„Po co nam takie zajęcia?”

„Czasami są potrzebne. Zasadniczo StringReader jest adapterem między klasami String i Reader . A StringWriter to String, który dziedziczy Writer . Tak… Widzę, że to nie jest najlepsze wyjaśnienie. Lepiej będzie spojrzeć na parę najpierw przykładów”.

„Załóżmy na przykład, że chcesz przetestować swoją metodę, która odczytuje dane z przekazanego do niej obiektu Reader. Możemy to zrobić w ten sposób:”

Czytanie z obiektu 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);
 }
}

„Innymi słowy, po prostu wzięliśmy String, zawinęliśmy go w StringReader, a następnie przekazaliśmy go zamiast obiektu Reader? I wszystko zostanie z niego odczytane tak, jak potrzebujemy?”

„Tak. Hmm. I jest w tym racja. Teraz przetestujmy metody StringWriter. Aby to zrobić, skomplikujemy przykład. Teraz nie będzie on po prostu czytał linii i wyświetlał je na ekranie, zamiast tego odwróci je i wyśle ​​do obiektu pisarza. Na przykład:"

Czytanie z obiektu czytelnika i pisanie do obiektu pisarza:
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);
 }
}

„Stworzyliśmy obiekt StringWriter , który zawiera ciąg znaków, który przechowuje wszystko, co zostało zapisane w tym zapisie . Aby go uzyskać, wystarczy wywołać metodę toString ()”.

„Hmm. Jakoś to wszystko wydaje się zbyt proste. Metoda executor działa z obiektami strumienia czytającego i piszącego , ale w metodzie main pracujemy z ciągami znaków.

– Czy to wszystko jest naprawdę takie proste?

„Tak. Aby przekonwertować String na Reader , po prostu napisz to:”

Tworzenie czytnika z ciągu
String s = "data";
Reader reader = new StringReader(s);

„A konwersja StringWriter na String jest jeszcze łatwiejsza:”

Pobieranie ciągu od pisarza
Writer writer = new StringWriter();
/* Here we write a bunch of data to the writer */
String result = writer.toString();

„Moim zdaniem to doskonałe zajęcia. Dzięki, że mi o nich opowiedziałaś, Ellie”.