1 klasaOutputStream
Właśnie zajęliśmy się strumieniami wejściowymi. Czas porozmawiać o strumieniach wyjściowych.
Klasa OutputStream
jest klasą nadrzędną wszystkich klas obsługujących wyjście bajtowe. Jest to klasa abstrakcyjna, która sama nic nie robi: w tym celu ma klasy potomne na każdą okazję.
Brzmi skomplikowanie. Upraszczając, ta klasa operuje na bajtach, a nie np. znakach czy innych typach danych. A fakt, że jest abstrakcyjny, oznacza, że zwykle nie używamy go, ale jednej z jego klas potomnych. Na przykład FileOutputStream
i inni go lubią.
Ale wracając do klasy OutputStream
. 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 w strumieniu wszystkie dane przechowywane w buforze |
|
Zamyka strumień |
Podczas tworzenia obiektu klasy pochodnej InputStream
zwykle określa się obiekt źródłowy, z którego InputStream
mają być odczytywane dane. Kiedy tworzysz obiekt klasy pochodnej, OutputStream
zwykle określasz również obiekt docelowy lub strumień, do którego zostaną zapisane dane.
Omówmy pokrótce wszystkie metody klasy OutputStream
:
metodawrite(int b)
Ta metoda zapisuje jeden bajt (nie int
) do strumienia wyjściowego. Przekazana wartość jest rzutowana na typ bajtowy, pierwsze trzy bajty są odrzucane.
metodawrite(byte[] buffer)
Zapisuje podaną tablicę bajtów w strumieniu wyjściowym. Wszystko.
metodawrite(byte[] buffer, int offset, int length)
Zapisuje część przekazanej tablicy bajtów do strumienia wyjściowego. Zmienna offset określa numer pierwszego elementu tablicy, length
długość fragmentu do zapisania.
metodaflush()
Metoda flush()
służy do wymuszania zapisu danych w strumieniu docelowym, który może być buforowany w bieżącym strumieniu. Istotne przy stosowaniu buforowania i/lub kilku obiektów strumieni zorganizowanych w łańcuch.
metodaclose()
Zapisuje wszystkie niezapisane dane w miejscu docelowym. Metodę close()
można pominąć, jeśli użyjesz opcji try-with-resources
-with-resources.
Przykład — kopiowanie 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. KlasaWriter
Klasa Writer
jest kompletnym odpowiednikiem klasy OutputStream
, i znowu tylko z jedną różnicą: działa ze znakami char
zamiast bajtów.
To jest klasa abstrakcyjna: Writer
nie można tworzyć instancji obiektów klasy. Jego głównym celem jest bycie pojedynczą klasą nadrzędną dla setek klas potomnych i zapewnienie im wspólnych metod pracy ze strumieniami znaków.
Metody klasy Writer
(i wszystkie jej klasy potomne):
Metody | Opis |
---|---|
|
Zapisuje jeden znak (nie int ) do strumienia. |
|
Zapisuje tablicę znaków w strumieniu |
|
Zapisuje część tablicy znaków w strumieniu |
|
Zapisuje ciąg znaków w strumieniu |
|
Zapisuje część ciągu do strumienia |
|
Zapisuje w strumieniu wszystkie dane przechowywane w buforze |
|
Zamyka strumień |
Metody są bardzo podobne do metod klasowych OutputStream
, z tą różnicą, że działają ze znakami zamiast bajtów.
Krótki opis metod:
metodawrite(int b)
char
Ta metoda zapisuje pojedynczy znak (nie ) do strumienia wyjściowego int
. Przekazana wartość jest rzutowana na char
, pierwsze dwa bajty są odrzucane.
metodawrite(char[] buffer)
Zapisuje podaną tablicę znaków w strumieniu wyjściowym.
metodawrite(char[] buffer, int offset, int length)
Zapisuje część przekazanej tablicy znaków do strumienia wyjściowego. Zmienna offset
określa numer pierwszego elementu tablicy, length
długość zarejestrowanego fragmentu.
metodawrite(String str)
Zapisuje podany ciąg w strumieniu wyjściowym.
metodawrite(String str, int offset, int length)
Zapisuje część podanego ciągu do strumienia wyjściowego: ciąg jest konwertowany na tablicę znaków. Zmienna offset
określa numer pierwszego elementu tablicy, length
długość zarejestrowanego fragmentu.
metodaflush()
Metoda flush()
służy do wymuszania zapisu danych w strumieniu docelowym, który może być buforowany w bieżącym strumieniu. Istotne przy stosowaniu buforowania i/lub kilku obiektów strumieni zorganizowanych w łańcuch.
metodaclose()
Zapisuje wszystkie niezapisane dane w miejscu docelowym. Metodę close()
można pominąć, jeśli użyjesz opcji try-with-resources
-with-resources.
Przykładowy program kopiujący plik tekstowy:
Kod | Notatka |
---|---|
|
Reader do odczytu z pliku Writer do zapisu do pliku Bufor do którego odczytamy dane Dopóki w strumieniu są dane Wczytaj dane do bufora Zapisz dane z bufora do drugiego strumienia |
KlasaStringWriter
Jest jeszcze jedna interesująca klasa, która dziedziczy po klasie Writer
— jest to StringWriter
. Zawiera zmienny napis - obiekt StringBuffer
. I za każdym razem, gdy „wpiszesz” coś do obiektu StringWriter
, tekst jest po prostu dodawany do wewnętrznego bufora.
Przykład:
Kod | Notatka |
---|---|
|
Docelowy strumień znaków jest tworzony StringWriter Ciąg jest zapisywany wewnętrznie do bufora StringWriter Ciąg jest zapisywany wewnętrznie do bufora StringWriter Konwertuje zawartość obiektu na ciąg znaków |
W tym przypadku StringWriter
klasa jest zasadniczo opakowaniem klasy StringBuffer
, ale klasa StringWriter
jest potomkiem strumienia klas Writer
i może być używana w łańcuchach obiektów strumieniowych. Całkiem przydatna funkcja w praktyce.