"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:”
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:"
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:”
String s = "data";
Reader reader = new StringReader(s);
„A konwersja StringWriter na String jest jeszcze łatwiejsza:”
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”.
GO TO FULL VERSION