X


Historia wymaga pasterzy, nie rzeźników.

. ,, .,
Strumienie buforowane ;
Klasa Buf feredOutputStream przechowuje buforowane dane w buforze (chro-
nionej tablicy bajt�w zwanej buf) do czasu, a� bufor si� nape�ni lub strumie� zosta-
nie opr�niony. Nast�pnie zapisuje jednocze�nie wszystkie dane na jej podstawo-
wym strumieniu wyj�ciowym. Jeden zapis wielu bajt�w jest prawie zawsze szybszy
ni� wiele ma�ych zapis�w, kt�re dodaj� je porcjami. Szczeg�lnie dotyczy to po��cze�
sieciowych, poniewa� ka�dy segment TCP lub pakiet UDP przenosi sko�czon� ilo��
danych narzutu, zazwyczaj wart� oko�o 40 bajt�w. A to oznacza, �e przes�anie l kilo-
bajta danych po jednym bajcie wymaga wys�ania kablem 40 kilobajt�w, podczas gdy
wys�anie ich razem nieco ponad l kilobajt danych. Wi�kszo�� kart sieciowych i im-
plementacji TCP ma wbudowany pewien poziom buforowania, wi�c prawdziwe
statystyki nie s� a� tak dramatyczne. Niemniej jednak buforowanie wyj�cia siecio-
wego na og� ogromnie poprawia wydajno��.
90______________________________^ Rozdzia^Wej�cie^wyi�cie w Javie
Klasa Buf f eredlnputStream tak�e posiada chronion� tablic� bajt�w zwan� buf,
kt�ra s�u�y jako bufor. Gdy wywo�ywana jest jedna z metod read () strumienia, to
najpierw pr�buje ona pobra� ��dane dane z bufora. Dopiero kiedy bufor opr�ni si�
z danych, strumie� czyta z podstawowego �r�d�a. W tym momencie wczytuje ze
�r�d�a do bufora tyle danych, ile zdo�a, niezale�nie od tego, czy potrzebuje wszyst-
kich tych danych ju� teraz, czy nie. Dane, kt�re nie zostan� wykorzystane natych-
miast, b�d� dost�pne przy nast�pnych wywo�aniach metody read (). Przeczytanie
kilku tysi�cy bajt�w danych z podstawowego strumienia, je�li pliki s� czytane z dys-
ku lokalnego, jest prawie tak samo szybkie, jak wczytanie jednego bajta danych. Wi-
da� zatem, �e buforowanie znacznie poprawia wydajno��. Zysk jest mniej oczywisty
przy po��czeniach sieciowych, gdzie cz�sto pr�dko��, przy kt�rej sie� mo�e dostar-
cza� dane, jest determinowana przez �korek" w sieci, a nie przez pr�dko��, z jak� in-
terfejs sieciowy dostarcza dane programowi, ani nie pr�dko��, z jak� dzia�a pro-
gram. Pomimo tego buforowanie wej�cia rzadko jest szkodliwe, a b�dzie stawa� si�
coraz istotniejsze, w miar� jak pr�dko�� w sieci b�dzie ros�a.
KlasaBuf f eredlnputStream ma dwa konstruktor)', podobnie jak Buf f eredOut-
putStream:
public BufferedlnputStream(InputStream in) .
public BufferedlnputStream(InputStream in, int bufferSize) .. :'
public BufferedOutputStream(OutputStream out)
public Buf feredOutputStream (OutputStream out, int bufferSize) .' �,. �
Pierwszy argument jest podstawowym strumieniem, z kt�rego zostan� odczytane
niezbuforowane dane lub w kt�rym zostan� zapisane buforowane dane. Drugi ar-
gument, je�li jest okre�lony, definiuje liczb� bajt�w w buforze. W przeciwnym przy-
padku rozmiar bufora jest ustalany na 2048 bajt�w dla strumienia wej�ciowego i 512
bajt�w dla strumienia wyj�ciowego. Idealny rozmiar bufora zale�y od rodzaju bufo-
rowanego strumienia. Dla po��cze� sieciowych dobrze jest mie� bufor troch� wi�k-
szy od typowego rozmiaru pakietu. Jednak mo�e to by� trudne do przewidzenia
i zmienia� si� w zale�no�ci od lokalnych po��cze� sieciowych i protoko��w. Szybsze
sieci o szerszym pa�mie przenoszenia raczej u�ywaj� wi�kszych pakiet�w, tak wi�c
8 kilobajt�w jest w efekcie maksymalnym rozmiarem pakietu dla UDP w wi�kszo�ci
wsp�czesnych sieci, a segmenty TCP cz�sto maj� nie wi�cej ni� jeden kilobajt.
Klasa Buf feredlnputStream nie ma zadeklarowanych �adnych nowych,
w�asnych metod. Nadpisuje jedynie metody z klasy Ir.put.Stream. Obs�uguje zna-
kowanie i cofanie. Na przyk�ad:
public synchronized int read O throws IOExcepticr.
public synchronized int read (byte [ ] input, inr offset, int length)
throws IOException
public synchronized long skipdong n) throws ICEy.ception
public synchronized int available() throws IOExcepticn �'�'� �' � , �
public synchronized void mark(int readLimit) -.': ': '. � '.
public synchronized void resetO throws IOExcepticn
public boolean markSupported()
Pocz�wszy od Javy 1.2, dwie wielobajtowe metody read () staraj� si� kompletnie
wype�ni� wybran� tablic� lub podtablic� danych, czytaj�c z podstawowego strumie-
nia wej�ciowego tyle razy, ile jest to konieczne. Zwracaj� dane tylko wtedy, gdy ta-
Strumienie filtruj�ce_________________________________________97
blica lub podtablica zosta�a w ca�o�ci wype�niona, koniec strumienia zosta� osi�gni�-
ty albo gdy podstawowy strumie� zablokowa�by si� przy dalszych odczytach. Wi�-
kszo�� strumieni wej�ciowych (w tym buforowany strumie� wej�ciowy w Javie l .1 .x
i wcze�niejszych) nie dzia�a w opisany tu spos�b. Czytaj� one z podstawowego stru-
jnienia lub �r�d�a danych tylko jeden raz, zanim zaczn� zwraca� dane.
Klasa Buf f eredOutputStream tak�e nie ma zadeklarowanych �adnych nowych,
w�asnych metod. Nadpisuje jedynie trzy metody z klasy OutputStream:
public synchronized void write(int b) throws IOException
public synchronized void write (byte [] data, int offset, int length) � '� ''
throws IOException -.;'
public synchronized void flushO throws I�Exception
Wywo�uje si� te metody dok�adnie tak samo jak w przypadku ka�dego innego stru-
mienia wyj�ciowego. R�nica polega na tym, �e ka�da metoda write () umieszcza
dane w buforze, a nie bezpo�rednio w podstawowym strumieniu wyj�ciowym. Dla-
tego tak istotne jest opr�nianie strumienia, gdy tylko mo�na to zrobi�.
Klasa PrintStream
Klasa PrintStream jest pierwszym wyj�ciowym strumieniem filtruj�cym, z kt�-
rym spotyka si� wi�kszo�� programist�w, poniewa� strumie� System, out jest
klas� PrintStream. Natomiast inne strumienie wyj�ciowe mog� by� �a�cuchowo
do��czane do strumieni drukuj�cych za pomoc� poni�szych dw�ch konstruktor�w:
public PrintStream(OutputStream out)
public PrintStream(OutputStream out, boolean autoFlush)
Domy�lnie strumienie drukuj�ce powinny by� w jawny spos�b opr�niane. Je�li jed-
nak argumentem autoFlush jest true, to strumie� b�dzie opr�niany za ka�dym
razem, gdy zostanie zapisana tablica bajt�w lub znak przesuwu o wiersz albo gdy
zostanie wywo�ana metoda println ().
Klasa PrintStream, opr�cz typowych metod write (), f lush () iclose(),ma
dziewi�� przedefiniowanych metod print () i dziesi�� przedefiniowanych metod
println ():
public void print (boolean b) '� �''''' '*'
public void print(char c) � >'�'"'!��'"��� -.�-:�' 7;"*�'TJ .-,,:.

Podstrony

Drogi użytkowniku!

W trosce o komfort korzystania z naszego serwisu chcemy dostarczać Ci coraz lepsze usługi. By móc to robić prosimy, abyś wyraził zgodę na dopasowanie treści marketingowych do Twoich zachowań w serwisie. Zgoda ta pozwoli nam częściowo finansować rozwój świadczonych usług.

Pamiętaj, że dbamy o Twoją prywatność. Nie zwiększamy zakresu naszych uprawnień bez Twojej zgody. Zadbamy również o bezpieczeństwo Twoich danych. Wyrażoną zgodę możesz cofnąć w każdej chwili.

 Tak, zgadzam się na nadanie mi "cookie" i korzystanie z danych przez Administratora Serwisu i jego partnerów w celu dopasowania treści do moich potrzeb. Przeczytałem(am) Politykę prywatności. Rozumiem ją i akceptuję.

 Tak, zgadzam się na przetwarzanie moich danych osobowych przez Administratora Serwisu i jego partnerów w celu personalizowania wyświetlanych mi reklam i dostosowania do mnie prezentowanych treści marketingowych. Przeczytałem(am) Politykę prywatności. Rozumiem ją i akceptuję.

Wyrażenie powyższych zgód jest dobrowolne i możesz je w dowolnym momencie wycofać poprzez opcję: "Twoje zgody", dostępnej w prawym, dolnym rogu strony lub poprzez usunięcie "cookies" w swojej przeglądarce dla powyżej strony, z tym, że wycofanie zgody nie będzie miało wpływu na zgodność z prawem przetwarzania na podstawie zgody, przed jej wycofaniem.