"To znowu ja."
"Cześć, Ellie!"
„Dzisiaj chciałbym opowiedzieć wam wszystko o BufferedReader i BufferedWriter ”.
- Już mi o nich opowiadałeś. Naprawdę nie są takie skomplikowane.
„OK. W takim razie powiedz mi, jak działa BufferedReader ”.
" BufferedReader jest jak konwerter 110/220V."
„Musisz przekazać konstruktorowi BufferedReader obiekt Reader , z którego będą odczytywane dane. Obiekt BufferedReader odczytuje duże porcje danych z czytnika i przechowuje je wewnętrznie w buforze. Dlatego użycie BufferedReader do odczytu z czytnika jest szybsze niż czytanie bezpośrednio od Czytelnika ”.
„Zgadza się. A co z BufferedWriter ?”
„To bułka z masłem. Załóżmy, że piszemy do FileWriter . Dane są natychmiast zapisywane na dysku. Jeśli często zapisujemy małe bity danych, często uderzamy w dysk, co znacznie spowalnia program. Ale jeśli użyjemy BufferedWriter jako „konwertera", operacja zapisu jest znacznie szybsza. Kiedy piszesz do BufferedWriter , zapisuje dane w wewnętrznym buforze. Kiedy bufor jest pełny, zapisuje dane do Writer jako jeden duży fragment. To jest znacznie szybsze”.
„Hmm. Słusznie. Ale o czym zapomniałeś?”
„Po zakończeniu pisania musisz wywołać metodę flush() na obiekcie BufferedWriter , aby zmusić go do wysłania danych znajdujących się jeszcze w buforze do obiektu Writer ”.
"I co jeszcze?"
„Co jeszcze? Och! Dopóki bufor nie został zapisany do Pisarza , dane mogą zostać usunięte i/lub zastąpione”.
"Amigo! Jestem pod wrażeniem! Jesteś ekspertem! W takim razie opowiem ci o kilku nowych klasach: ByteArrayStream i PrintStream ."
„Na przykład ByteArrayInputStream i ByteArrayOutputStream ”.
„Te klasy są trochę jak StringReader i StringWriter . Z wyjątkiem tego, że StringReader odczytuje znaki ( char ) z ciągu znaków ( String ), ale InputStream odczytuje bajty z tablicy bajtów ( ByteArray ).”
StringWriter zapisuje znaki ( char ) do łańcucha, podczas gdy ByteArrayOutputStream zapisuje bajty do wewnętrznej tablicy bajtów. Kiedy piszesz do StringWriter , jego wewnętrzny łańcuch wydłuża się, a kiedy piszesz do ByteArrayOutputStream , jego wewnętrzna tablica bajtów również rozwija się dynamicznie.
„Pamiętaj przykład, który otrzymałeś na ostatniej lekcji:”
public static void main (String[] args) throws Exception
{
String test = "Hi!\n My name is Richard\n I'm a photographer\n";
StringReader reader = new StringReader(test);
StringWriter writer = new StringWriter();
executor(reader, writer);
String result = writer.toString();
System.out.println("Result: "+ result);
}
public static void executor(Reader reader, Writer writer) throws Exception
{
BufferedReader br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
StringBuilder sb = new StringBuilder(line);
String newLine = sb.reverse().toString();
writer.write(newLine);
}
}
„Oto, jak by to wyglądało, gdyby działało przy użyciu bajtów zamiast znaków:”
public static void main (String[] args) throws Exception
{
String test = "Hi!\n My name is Richard\n I'm a photographer\n";
InputStream inputStream = new ByteArrayInputStream(test.getBytes());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
executor(inputStream, outputStream);
String result = new String(outputStream.toByteArray());
System.out.println("Result: "+ result);
}
public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception
{
BufferedInputStream bis = new BufferedInputStream(inputStream);
while (bis.available() > 0)
{
int data = bis.read();
outputStream.write(data);
}
}
„Wszystko jest takie samo, jak w powyższym przykładzie. Z tą różnicą, że zamieniliśmy String na ByteArray, Reader na InputStream i Writer na OutputStream”.
„Jedyne dwa inne kroki to konwersja ciągu znaków na obiekt ByteArray iz powrotem. Jak widać, można to zrobić dość łatwo:”
public static void main (String[] args) throws Exception
{
String test = "Hi!\n My name is Richard\n I'm a photographer\n";
byte[] array = test.getBytes();
String result = new String(array);
System.out.println("Result: "+ result);
}
„Aby pobrać bajty, które zostały już dodane do obiektu ByteArrayOutputStream, wywołaj metodę toByteArray ()”.
„Ach. Podobieństwa do StringReader/StringWriter są dość duże, zwłaszcza po tym, jak mi je wskazałeś. Dziękuję, Ellie, za naprawdę interesującą lekcję”.
„Dokąd tak się śpieszysz? Nadal mam dla ciebie mały prezent. Chcę ci opowiedzieć o zajęciach PrintStream”.
„PrintStream? Pierwszy raz słyszę o takich zajęciach”.
„Tak. Szczególnie, jeśli nie liczyć faktu, że używasz go od pierwszego dnia studiów w Javie. Pamiętasz System.out ? Cóż, System.out jest statyczną (klasową) zmienną klasy System class, a jej typem jest... PrintStream ! Stąd biorą się wszystkie metody print, println itp.".
„Wow. Jakie to interesujące. Jakoś nigdy tego nie brałem pod uwagę. Opowiedz mi więcej”.
„Dobrze. Dobra, posłuchaj. Klasa PrintStream została wymyślona z myślą o czytelnym wyjściu. Składa się prawie wyłącznie z metod print i println. Spójrz na tę tabelę:”
Metody | Metody |
---|---|
void print(boolean b) |
void println(boolean b) |
void print(char c) |
void println(char c) |
void print(int c) |
void println(int c) |
void print(long c) |
void println(long c) |
void print(float c) |
void println(float c) |
void print(double c) |
void println(double c) |
void print(char[] c) |
void println(char[] c) |
void print(String c) |
void println(String c) |
void print(Object obj) |
void println(Object obj) |
void println() |
|
PrintStream format (String format, Object ... args) |
|
PrintStream format (Locale l, String format, Object ... args) |
„Istnieje również kilka metod formatowania, dzięki którym można wyprowadzać dane za pomocą ciągu formatującego. Na przykład:”
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
My name is Kolan. My age is 25.
„Tak, pamiętam. Przestudiowaliśmy już metodę formatowania klasy String”.
"To wszystko na teraz."
– Dzięki, Ellie.
GO TO FULL VERSION