1. OutputStream
klasa
Niedawno zbadaliśmy strumienie danych wejściowych. Czas porozmawiać o strumieniach wyjściowych.
Klasa OutputStream
jest klasą nadrzędną dla wszystkich klas obsługujących wyjście bajtowe. Jest to klasa abstrakcyjna, która sama nic nie robi, ale ma klasy potomne na każdą okazję.
Brzmi to niezwykle skomplikowanie. Upraszczając, ta klasa operuje na bajtach, a nie np. znakach czy innych typach danych. A fakt, że jest abstrakcyjny, oznacza, że zwykle go nie używamy, ale raczej jedną z jego klas potomnych. Na przykład FileOutputStream
i tym podobne.
Ale wracając do OutputStream
klasy. Ta klasa ma metody, które muszą implementować wszystkie jej klasy potomne. Oto główne:
Metody | Opis |
---|---|
|
Zapisuje jeden bajt (nie int ) do strumienia. |
|
Zapisuje tablicę bajtów do strumienia |
|
Zapisuje część tablicy bajtów do strumienia |
|
Zapisuje wszystkie dane przechowywane w buforze do strumienia |
|
Zamyka strumień |
Kiedy tworzysz obiekt klasy, która dziedziczy InputStream
, zwykle określasz obiekt źródłowy, InputStream
z którego odczytuje dane. Kiedy tworzysz obiekt klasy, która dziedziczy OutputStream
, zwykle określasz również obiekt docelowy lub strumień, do którego będą zapisywane dane.
Omówmy pokrótce wszystkie metody klasy OutputStream
:
write(int b)
metoda
Ta metoda zapisuje jeden bajt (nie int
) do strumienia wyjściowego. Przekazana wartość jest rzutowana na bajt, a pierwsze trzy bajty int są odrzucane.
write(byte[] buffer)
metoda
Zapisuje podaną tablicę bajtów w strumieniu wyjściowym. Otóż to.
write(byte[] buffer, int offset, int length)
metoda
Zapisuje część przekazanej tablicy bajtów do strumienia wyjściowego. Zmienna przesunięcia wskazuje indeks pierwszego elementu tablicy i length
jest długością podzbioru, który ma zostać zapisany.
flush()
metoda
Ta flush()
metoda służy do wymuszenia zapisania danych potencjalnie buforowanych w bieżącym strumieniu do strumienia docelowego. Jest to istotne w przypadku korzystania z buforowania i/lub wielu obiektów strumieniowych ułożonych w łańcuch.
close()
metoda
Zapisuje wszystkie niezapisane dane w obiekcie docelowym. Metoda close()
nie musi być wywoływana, jeśli używasz try-with-resources
bloku.
Przykład kopiowania pliku
Kod | Notatka |
---|---|
|
InputStream do odczytu z pliku OutputStream do zapisu do pliku Bufor do którego wczytamy dane Dopóki w strumieniu są dane Wczytaj dane do bufora Zapisz dane z bufora do drugiego strumienia |
2. Writer
klasa
Klasa Writer
jest dokładnie taka sama jak OutputStream
klasa, ale jest jeszcze jedna różnica: działa ze znakami ( char
) zamiast bajtami.
To jest klasa abstrakcyjna: nie można tworzyć obiektów tej Writer
klasy. Jego głównym celem jest bycie wspólną klasą nadrzędną dla setek klas potomnych i zapewnienie im wspólnych metod pracy ze strumieniami znaków.
Metody klasy Writer
(i wszystkich jej klas potomnych):
Metody | Opis |
---|---|
|
Zapisuje jeden znak (nie int ) do strumienia. |
|
Zapisuje tablicę znaków w strumieniu |
|
Zapisuje część tablicy znaków do strumienia |
|
Zapisuje ciąg znaków w strumieniu |
|
Zapisuje część ciągu do strumienia |
|
Zapisuje wszystkie dane przechowywane w buforze do strumienia |
|
Zamyka strumień |
Metody są bardzo podobne do metod klasy OutputStream
, ale działają ze znakami zamiast bajtów.
Opis metod:
write(int b)
metoda
Ta metoda zapisuje pojedynczy znak ( char
— nie an int
) do strumienia wyjściowego. Przekazana wartość jest rzutowana na a char
, a pierwsze dwa bajty są odrzucane.
write(char[] buffer)
metoda
Zapisuje podaną tablicę znaków w strumieniu wyjściowym.
write(char[] buffer, int offset, int length)
metoda
Zapisuje część przekazanej tablicy znaków do strumienia wyjściowego. Zmienna offset
wskazuje indeks pierwszego elementu tablicy i length
jest długością podzbioru do zapisania.
write(String str)
metoda
Zapisuje podany ciąg w strumieniu wyjściowym.
write(String str, int offset, int length)
metoda
Zapisuje część podanego ciągu do strumienia wyjściowego: ciąg jest konwertowany na tablicę znaków. Zmienna offset
wskazuje indeks pierwszego elementu tablicy i length
jest długością podzbioru do zapisania.
flush()
metoda
Ta flush()
metoda służy do wymuszenia zapisania danych potencjalnie buforowanych w bieżącym strumieniu do strumienia docelowego. Jest to istotne w przypadku korzystania z buforowania i/lub wielu obiektów strumieniowych ułożonych w łańcuch.
close()
metoda
Zapisuje wszystkie niezapisane dane w obiekcie docelowym. Metoda close()
nie musi być wywoływana, jeśli używasz try-with-resources
bloku.
Przykład programu kopiującego plik tekstowy:
Kod | Notatka |
---|---|
|
Reader do odczytu z pliku Writer do zapisu do pliku Bufor do którego wczytamy dane Dopóki w strumieniu są dane Wczytaj dane do bufora Zapisz dane z bufora do drugiego strumienia |
StringWriter
klasa
Jest jeszcze jedna interesująca klasa, która dziedziczy Writer
klasę: nazywa się StringWriter
. Zawiera zmienny napis — StringBuffer
obiekt. I za każdym razem, gdy „piszesz” coś do StringWriter
obiektu, tekst jest po prostu dodawany do jego wewnętrznego bufora.
Przykład:
Kod | Notatka |
---|---|
|
StringWriter Tworzony jest docelowy strumień znaków ( ) Ciąg znaków jest zapisywany w buforze wewnątrz Ciąg StringWriter znaków jest zapisywany w buforze wewnątrz StringWriter Konwertowanie zawartościobiektu na ciąg znaków |
W tym przypadku StringWriter
klasa jest zasadniczo opakowaniem StringBuffer
klasy, ale StringWriter
klasa jest potomkiem Writer
klasy strumienia i może być używana w łańcuchach obiektów strumienia. Jest to bardzo przydatna właściwość w praktyce.
3. PrintStream
klasa
Klasy strumieni wyjściowych można również umieścić w łańcuchu ze strumieniami pośrednimi, które zapisują dane w przekazywanym im strumieniu docelowym. Ogólny widok interakcji tych strumieni wygląda następująco:
Najbardziej interesującym i wszechstronnym ze wszystkich pośrednich strumieni wyjściowych jest PrintStream
. Posiada dziesiątki metod i aż 12 konstruktorów.
Klasa PrintStream
dziedziczy FilterOutputStream
klasę, która dziedziczy OutputStream
. Oznacza to, że klasa oprócz własnych metodPrintStream
ma wszystkie metody klas nadrzędnych . Oto najciekawsze z nich:
Metody | Opis |
---|---|
|
Konwertuje przekazany obiekt na ciąg i wyprowadza go do strumienia docelowego. |
|
Konwertuje przekazany obiekt na ciąg i wyprowadza go do strumienia docelowego. Dodaje podział linii na końcu |
|
Wysyła znak końca wiersza do strumienia docelowego |
|
Konstruuje i wyprowadza ciąg na podstawie ciągu formatującego i przekazanych argumentów; podobna do String.format() metody |
A gdzie są te dziesiątki metod, pytasz?
Cóż, ma wiele wariantów metod print()
i println()
o różnych parametrach. Można je podsumować w tej tabeli.
Nie będziemy zagłębiać się w te metody, ponieważ już je dobrze znasz. Domyślasz się, do czego zmierzam?
pamiętasz System.out.println()
? Ale można to zapisać w dwóch linijkach:
Kod | Wyjście konsoli |
---|---|
|
|
Naszym ulubionym poleceniem jest wywołanie metody na zmiennej statycznej klasy . Typ tej zmiennej to .System.out.println()
println()
out
System
PrintStream
Na wielu poziomach CodeGym iw prawie każdym zadaniu wywoływałeś metody klasy, PrintStream
nawet o tym nie wiedząc!
Praktyczne użycie
Java ma tę interesującą klasę o nazwie ByteArrayOutputStream
, która jest dynamicznie rosnącą tablicą bajtów, która dziedziczy OutputStream
.
Obiekt ByteArrayOutputStream
i PrintStream
obiekt można połączyć łańcuchowo w następujący sposób:
Kod | Opis |
---|---|
|
Utwórz bufor zapisu w pamięci Zapakuj bufor w PrintStream obiekt Zapisz dane do konsoli Zamień tablicę na łańcuch! Wyjście konsoli:
|
GO TO FULL VERSION