1 klasaOutputStream

Właśnie zajęliśmy się strumieniami wejściowymi. Czas porozmawiać o strumieniach wyjściowych.

Klasa OutputStreamjest 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 FileOutputStreami 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
void write(int b)
Zapisuje jeden bajt (nie int) do strumienia.
void write(byte[] buffer)
Zapisuje tablicę bajtów do strumienia
void write(byte[] buffer, off, len)
Zapisuje część tablicy bajtów do strumienia
void flush()
Zapisuje w strumieniu wszystkie dane przechowywane w buforze
void close()
Zamyka strumień

Podczas tworzenia obiektu klasy pochodnej InputStreamzwykle określa się obiekt źródłowy, z którego InputStreammają być odczytywane dane. Kiedy tworzysz obiekt klasy pochodnej, OutputStreamzwykle 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, lengthdł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
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamdo odczytu z pliku
OutputStreamdo 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 Writerjest kompletnym odpowiednikiem klasy OutputStream, i znowu tylko z jedną różnicą: działa ze znakami charzamiast bajtów.

To jest klasa abstrakcyjna: Writernie 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
void write(int b)
Zapisuje jeden znak (nie int) do strumienia.
void write(char[] buffer)
Zapisuje tablicę znaków w strumieniu
void write(char[] buffer, off, len)
Zapisuje część tablicy znaków w strumieniu
void write(String str)
Zapisuje ciąg znaków w strumieniu
void write(String str, off, len)
Zapisuje część ciągu do strumienia
void flush()
Zapisuje w strumieniu wszystkie dane przechowywane w buforze
void close()
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)

charTa 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 offsetokreśla numer pierwszego elementu tablicy, lengthdł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 offsetokreśla numer pierwszego elementu tablicy, lengthdł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
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerdo odczytu z pliku
Writerdo 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
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
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 StringWriterklasa jest zasadniczo opakowaniem klasy StringBuffer, ale klasa StringWriterjest potomkiem strumienia klas Writeri może być używana w łańcuchach obiektów strumieniowych. Całkiem przydatna funkcja w praktyce.