To tylko jedna z 13 stron tej notatki. Zaloguj się aby zobaczyć ten dokument.
Zobacz
całą notatkę
Wejście/wyjście w Javie.
Problemy : rozmaitość obsługiwanych żródeł danych i celów ( konsola klawiatura, inne urządzenia, pliki, pamięć, łącza itp.)
konieczność zachowania przenośności na różne platformy
System wejścia/wyjścia jest oparty na pojęciu strumienia (znakowego lub binarnego ) .
Realizowany przez hierarchię klas - na pierwszy rzut oka bardzo rozbudowaną, ale i tak w miarę prosty w wyniku wykorzystania jednego z rodzajów wzorców projektowych - dekoratorów.
Na szczęście większość z nich jest przeznaczona do bardziej złożonych działań - wykorzystanie systemu do wykonywania podstawowych zadań ( drukowanie wyników , wczytywanie danych, współpraca z plikami ) jest stosunkowo proste.
Podstawowe klasy hierarchii to : InputStraem ( wejście binarne), OutputStream ( wyjście binarne), Reader(wejście znakowe) i Writer (wyjście znakowe). Podstwowe metody to : read - dla wejścia i write - dla wyjścia.
Dla ułatwienia podzieliłem wykład na dwie części :
strumienie standardowe ( tekstowy wydruk wyników na ekranie i wczytywanie danych z klawiatury)
wykorzystanie plików ( tekstowy i binarny zapis/odczyt).
Zgodnie z przyjętym założeniem przekazuję tylko podstawowe informacje umożliwiające efektywne wykorzystanie strumieni ( większość z tych działań można zrealizować na wiele sposobów - zazwyczaj będę ograniczał się do jednego).
Standardowe strumienie znakowe
Drukowanie wyników
Przy prostych wydrukach wystarczy wykorzystanie standardowego strumienia out ( obiekt klasy PrintStream) z klasy System z podstawowymi metodami : print, println i printf ( wydruk z formatowaniem). Jeśli zależy nam na efektywności i przenośności lepiej jest definiować własny strumień klasy PrintWriter , np. :
PrintWriter wyj= new PrintWriter( new BufferedWriter(new OutputStreamWriter (System.out)),true);
Do bardziej złożonych wydruków ( np. tabele, wykazy) należy stosować metodę printf.
PrintWriter
printf (String format, Object... args) Parametr format zawiera bezpośredni tekst i opis sposobu drukowania argumentów.
Ogólna postać formatu dla pojedynczego argumentu :
%[argument_index$][flags][width][.precision]conversion
Elementy w nawiasach [] są opcjonalne. argument_index numer argumentu ( od 1) , jeśli jest opuszczony drukuje kolejny (liczone są tylko nieindeksowane) element, indeks
(…)
… tekstowe
3 i 4 - pliki binarne ( do 4 najlepsze są pliki o dostępie bezpośrednim).
Uwaga : strumienie plikowe trzeba po wykorzystaniu zamykać używając metody close( ).
Przy wykorzystaniu plików tekstowych mamy dwa rozwiązania :
przekierowanie strumieni standardowych
Przez wywołanie metody z klasy System :
static void
setErr(PrintStream err) static void
setIn(InputStream in) static void
setOut(PrintStream…
… BufferedWriter(new FileWriter("wyniki.txt")),true);
lub prościej
PrintWriter wyj= new PrintWriter("wyniki.txt");
BufferedReader wej= new BufferedReader( new FileReader("dane.txt"));
StreamTokenizer st = new StreamTokenizer(wej);
Wykorzystanie tak jak to opisano w poprzednim wykładzie.
Przy plikach binarnych wykorzystujemy klasy : FileInputStream i FileOutputStream ( dla prostych danych ) lub ObjectInputStream…
…: jeśli obiekt ma pola typu obiektowego należy wykorzystać mechanizm serializacji\deserializacji. Każda z klas występujących w grafie zapisywanych obiektów musi implementować interfejs Serializable. Po zapisie i odczycie mamy odtworzony cały graf obiektów ( identyczne obiekty składowe nie są powielane).
Przy pracy bezpośrednio z plikiem ( plik jako wielka tablica w pamięci zewnętrznej ) wykorzystujemy klasę…
…)
szerokość - minimalna szerokość pola ( uzupełniana spacjami)
precyzja - maksymalna szerokość pola (brak oznacza brak ograniczeń)
flaga - '-' wyrównanie do lewego brzegu pola ( domyślne wyrównanie do prawego)
- char %[argument_index$][flags][width]conversion
konwersja : c lub C (wydruk wielkimi literami)
szerokość - minimalna szerokość pola ( uzupełniana spacjami)
flaga - '-' wyrównanie do lewego brzegu…
... zobacz całą notatkę
Komentarze użytkowników (0)