MODU 9 STRUMIENIE I PLIKI 93 Modu 9 Strumienie i pliki Zawarto jednostki Po zrealizowaniu jednostki bdziesz w stanie: odczytywa oraz zapisywa dane do pliku tekstowego i binarnego zarzdza systemem plików i katalogów systemu operacyjnego przetwarza strumie danych zasobów sieci Internet kompresowa pliki i katalogi zawarte na no nikach pamici Wprowadzenie Program komputerowy sk!ada si z cigu instrukcji wykonywanych przez komputer. Podstaw dla wykonania programu s dane wej ciowe, stanowice $ród!o informacji. Rezultatem dzia!ania programu s dane wyj ciowe, najcz ciej sk!adowane na no nikach pamici. Operacje wej cia-wyj cia (ang. I/O) stanowi fundament dla komunikacji programu komputerowego z otoczeniem. Strumienie danych Operacje wej cia-wyj cia w jzyku Java opieraj si na pojciu strumienia (ang. stream), rozumianego jako kana! transmisyjny, przez który przep!ywa sekwencja bajtów ze $ród!a do programu lub z programu do miejsca przeznaczenia. Gdy dane przekazywane s ze $ród!a do programu, mowa jest o potoku wej ciowym (ang. input stream), natomiast je li dane przekazywane s z programu do miejsca przeznaczenia, wtedy okre lane jest to jako strumie wyj ciowy (ang. output stream). 0ród!em, czy miejscem przeznaczenia danych mog by pliki dyskowe, urzdzenia (np. drukarka, skaner), inne programy, czy zasoby danych dostpne w sieci (np. zasoby sieci Internet). ródo danych strumie% wejcia Program w Javie Program w Javie strumie% wyjcia Miejsce przeznaczenia Rys. 3. Wejciowe i wyjciowe strumienie danych. Istnieje poka$na grupa klas bibliotecznych do obs!ugi strumieni danych. Poniewa1 Java dzieli strumienie danych na strumienie wej cia oraz wyj cia, std te1 dostpne klasy zosta!y podzielone na klasy obs!ugujce strumienie wej cia oraz wyj cia. Poni1sza tabela przedstawia klasy bazowe. Tabela 2. Modyfikatory dost!pu do sk#adowych obiektu. STRUMIE ZNAKOWY BINARNY Wejciowy (input) Java.io.Reader Java.io.InputStream Wyjciowy (output) Java.io.Writer Java.io.OutputStream
MODU 9 STRUMIENIE I PLIKI 94 W zale1no ci od charakteru $ród!a lub miejsca przeznaczenia danych korzystamy z dedykowanych klas pochodnych. STRUMIENIE PLIKOWE Sekwencyjny dostp do plików 105 realizowany jest poprzez klasy FileInputStream, FileOutputStream oraz FileReader, FileWriter. Dwie pierwsze umo1liwiaj dostp (odczyt oraz zapis) do danych binarnych (pliki graficzne, d$wikowe, ), a tak1e do danych tekstowych w formacie ASCII, natomiast dwa ostatnie realizuj dostp do plików tekstowych w formacie Unicode. Poni1szy program ilustruje odczyt zawarto ci pliku tekstowego. Nale1y zwróci uwag na konieczno u1ycia obs!ugi b!dów. public class OdczytPlikuTekstowego { FileReader plik = null; int znak; // obiekt reprezentuj3cy wskazany plik tekstowy plik = new FileReader("dane.txt"); // odczyt kolejnych znaków z pliku while ( (znak = plik.read())!= -1 ) { // wywietlenie odczytanego znaku na konsoli System.out.print((char)znak); catch (FileNotFoundException e) { System.out.println("Brak pliku o podanej nazwie!"); catch (IOException e) { System.out.println("Problem z odczytem pliku!"); finally { if (plik!= null) plik.close(); catch (IOException e){ System.out.println("Problem z zamkni>ciem pliku!"); Dla zwikszenia wydajno ci operacji wej cia wyj cia odczyt oraz zapis danych mo1e by buforowany co realizowane jest poprzez u1ycie klas BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter. FileReader plik = new FileReader("dane.txt"); BufferedReader plikbuforowany = new BufferedReader(plik); String liniatekstu; liniatekstu = plikbuforowany.readline(); Dodatkowo klasa BufferedReader posiada metod readline(), umo1liwiajc odczyt pojedynczej linii z pliku tekstowego. STRUMIENIE SIECIOWE W dobie Internetu trudno wyobrazi sobie jzyk programowania, który nie umo1liwia!by dostpu oraz korzystania z zasobów zgromadzonych w sieci. Jzyk programowania Java, dziki rozbudowanej bibliotece klas, posiada silne wsparcie dla wykonywania takich operacji. Jednym z podstawowych narzdzi umo1liwiajcym dostp do zasobów sieciowych jest klasa java.net.url. Dziki zastosowaniu ujednoliconego formatu adresowania URL (ang. Uniform Resource Locator), mo1liwe jest wykorzystanie dowolnego zasobu udostpnionego w sieci WWW. Mo1e nim by zarówno plik, katalog, ale tak1e poprzez wykorzystanie dostpnych protoko!ów, dostp do zasobów zgromadzonych w bazach 105 Wyró1niamy sekwencyjny dostp do plików (ang. sequencial access) oraz dostp swobodny (ang. random access).
MODU 9 STRUMIENIE I PLIKI 95 danych. Wikszo klas niezbdna do u1ycia dla komunikacji z zasobami Internetu dostpna jest w pakiecie java.net. Pliki i katalogi Obiekt klasy File reprezentuje pojedynczy plik w systemie lub katalog (równie1 nieistniejcy). Szereg metod tej klasy umo1liwia operowanie na plikach lub katalogach systemu. Poni1szy przyk!ad ilustruje u1ycie klasy File do wy wietlenia zawarto ci katalogu Windows: public class ZawartoscFolderu { String nazwafolderu = "C:" + File.separator + "WINDOWS"; File folder = new File(nazwaFolderu); for(string nazwaplikulubfolderu : folder.list()) System.out.println(nazwaPlikuLubFolderu); Ponadto metody klasy File umo1liwiaj w szczególno ci utworzenie nowego pliku, usuwanie plików, tworzenie folderów, zmian atrybutów plików, zmian nazwy pliku, sprawdzenie statusu (plik, czy katalog). Pe!ny wykaz metod dostpny jest w Java API. Pytania sprawdzajce 1. Wska1 ró1nice pomidzy klasami Reader oraz InputStream. 2. Jzyk Java zawiera par klas: InputStreamReader oraz OutputStreamWriter. Jaki jest cel stosowania tych klas? 3. Jak funkcj pe!ni metoda mkdirs() klasy java.io.file? 4. Wymie metody umo1liwiajce uzyskanie szczegó!owych informacji o dowolnym pliku dostpnym na no niku pamici. 5. Jak funkcj pe!ni pole statyczne File.separator? Podaj cel jego stosowania w kontek cie tworzenia programów uruchamianych w otoczeniu ró1nych systemów operacyjnych. 6. W jaki sposób mo1na uzyska znak koca linii, niezale1ny od stosowanego systemu operacyjnego? 7. Co oznacza skrót URL? Podaj sk!adni jego zapisu. 8. W jaki sposób realizowane jest dopisywanie danych na kocu pliku? Co stanie si, gdy plik do zapisu zostanie otwarty z warto ci parametru append równ false? 9. Operacja buforowania dostpu do danych pozwala na zwikszenie wydajno ci odczytu oraz zapisu informacji. W jaki sposób jest realizowana? 10. Co oznacza wyjtek: MalformedURLException? W jakiej sytuacji jest generowany? Zadania do wykonania Dla wykonania zada zawartych w tej sekcji utwórz plik tekstowy o nazwie RedutaOrdona.txt zawierajcy fragment utworu Adama Mickiewicza. REDUTA ORDONA OPOWIADANIE ADIUTANTA Nam strzela nie kazano. -- Wstpi!em na dzia!o I spójrza!em na pole; dwie cie armat grzmia!o. Artyleryi ruskiej cign si szeregi, Prosto, d!ugo, daleko, jako morza brzegi; I widzia!em ich wodza: przybieg!, mieczem skin! I jak ptak jedno skrzyd!o wojska swego zwin!; Wylewa si spod skrzyd!a ci niona piechota D!ug czarn kolumn, jako lawa b!ota,
MODU 9 STRUMIENIE I PLIKI 96 Nasypana iskrami bagnetów. Jak spy Czarne chorgwie na mier prowadz zastpy. Przeciw nim sterczy bia!a, wska, zaostrzona, Jak g!az bodzcy morze, reduta Ordona. Sze tylko mia!a armat; wci1 dymi i wiec; I nie tyle prdkich s!ów gniewne usta miec, Nie tyle przejdzie uczu przez dusz w rozpaczy, Ile z tych dzia! lecia!o bomb, kul i kartaczy. Patrz, tam granat w sam rodek kolumny si nurza, Jak w fale bry!a lawy, pu!k dymem zachmurza; Pka ród dymu granat, szyk pod niebo leci I ogromna!ysina ród kolumny wieci. Tam kula, lecc, z dala grozi, szumi, wyje. Ryczy jak byk przed bitw, miota si, grunt ryje; Ju1 dopad!a; jak boa ród kolumn si zwija, Pali piersi, rwie zbem, oddechem zabija. Najstraszniejszej nie wida, lecz s!ycha po d$wiku, Po waleniu si trupów, po ranionych jku: Gdy kolumn od koca do koca przewierci, Jak gdyby rodkiem wojska przeszed! anio! mierci. PLIKI I KATALOGI Zadanie 136 PojemnoscDyskow.java Wikszo komputerów wyposa1ona jest w pami masow. Napisz program wy wietlajcy na konsoli wykaz dostpnych no ników pamici wraz z informacj o ich ca!kowitej pojemno ci. Zapoznaj si z wykazem dostpnych metod klasy java.io.file. public class PojemnoscDyskow { String folderglowny = File.separator; String zasob; double pojemnosc; double GB = 1024*1024*1024; System.out.println("NAZWA POJEMNOLM"); File[] dyski = (new File(folderGlowny)).listRoots(); for(file dysk : dyski) { zasob = dysk.getpath(); pojemnosc = dysk.gettotalspace()/gb; System.out.printf("%4s %8.2fGB\n",zasob,pojemnosc); Zadanie 137 ParametryDyskow.java Napisz program, który dla ka1dego z no ników pamici dostpnych w systemie wy wietli na konsoli informacje o jego ca!kowitej pojemno ci, ilo ci przestrzeni zajtej oraz wolnej. Informacje wy wietl w MB. Zadanie 138 FolderDyskuSystemowego.java Napisz program wy wietlajcy zawarto folderu g!ównego dysku systemowego.
MODU 9 STRUMIENIE I PLIKI 97 public class FolderDyskuSystemowego { String nazwafolderu = "C:" + File.separator; File folder = new File(nazwaFolderu); for(string nazwaplikulubfolderu : folder.list()) System.out.println(nazwaPlikuLubFolderu); Zadanie 139 ZawartoscFolderu.java Napisz program wy wietlajcy na konsoli zawarto dowolnego folderu wskazanego w wierszu polece. W przypadku plików wy wietl ich nazw, rozmiar oraz dat ostatniej modyfikacji. Zapoznaj si z metodami klasy java.io.file: listfiles(), iffile(), isdirectory(), length(), lastmodified() Zadanie 140 ObjetoscPlikowFolderu.java Napisz program, obliczajcy ca!kowit objto plików zawartych we wskazanym katalogu. Przyk!adowe wywo!anie programu: java ObjetoscPlikowFolderu C:\WINDOWS Zadanie 141 StrukturaFolderow.java Folder (inaczej katalog) zwizany z logiczn organizacj danych na no nikach pamici, umo1liwia uporzdkowanie informacji zapisanych na dysku. Napisz program, który w katalogu bie1cym utworzy poni1sz struktur folderów: KOMPUTER (LAPTOP (IBM,COMPAQ), PALMTOP) Zadanie 142 TworzenieFolderow.java Napisz program, który we wskazanym katalogu utworzy folder o podanej nazwie. Informacj, gdzie utworzy nowy folder oraz nazw folderu do utworzenia odczytaj z wiersza polece. STRUMIENIE PLIKOWE Zadanie 143 RedutaOrdona.java Plik tekstowy RedutaOrdona.txt zawiera fragment utworu Adama Mickiewicza. Napisz program wy wietlajcy tre utworu na konsoli. Wykorzystaj przyk!adowy kod programu zawarty w cz ci teoretycznej. Zadanie 144 NumerowanieWierszy.java Napisz program, wy wietlajcy na konsoli ponumerowane wiersze pliku tekstowego RedutaOrdona.txt zgodnie z poni1szym przyk!adem: 01. Nam strzelat nie kazano. -- Wst3piem na dziao 02. I spójrzaem na pole; dwiecie armat grzmiao. 03. Artyleryi ruskiej ci3gn3 si> szeregi,... Zadanie 145 ZawartoscPlikuTekstowego.java Napisz program wy wietlajcy na konsoli zawarto dowolnego pliku tekstowego o nazwie podanej w wierszu polece. Zadanie 146 BuforowanieDanych.java Napisz program, który realizowa! bdzie buforowany odczyt zawarto ci pliku tekstowego. Korzystajc z programu, wy wietl na konsoli zawarto pliku RedutaOrdona.txt.
MODU 9 STRUMIENIE I PLIKI 98 Zadanie 147 StatystykaZnakowPliku.java Napisz program obliczajcy liczb samog!osek oraz spó!g!osek wystpujcych w pliku RedutaOrdona.txt. Uzyskane rezultaty wy wietl na konsoli. Zadanie 148 StatystykaPliku.java Praktycznie ka1dy edytor tekstu posiada mo1liwo okre lenia liczby znaków, czy wyrazów wystpujcych w edytowanym dokumencie. Napisz program, który dla pliku RedutaOrdona.txt wyznaczy liczb znaków, wyrazów oraz wierszy wystpujcych w utworze. Uzyskane rezultaty wy wietl na konsoli. Zadanie 149 KrainyGeograficzne.java Napisz program, który na podstawie danych odczytanych z wiersza polece umo1liwia utworzenie pliku tekstowego z wykazem krain geograficznych. Utwórz program na podstawie poni1szego kodu. Korzystajc z programu wprowad$ do pliku tekstowego nastpujce nazwy krain geograficznych: Karpaty, Wy1yna Ma!opolska, Pojezierze Mazurskie, Nizina Wielkopolska, Wy1yna Krakowsko-Czstochowska. public class KrainyGeograficzne { FileWriter plik = null; final boolean dopisywanie = true; // tryb zapisu do pliku String EOL = System.getProperty("line.separator"); // znak ko%ca linii // obiekt reprezentuj3cy wskazany plik tekstowy plik = new FileWriter("KrainyGeograficzne.txt",dopisywanie); plik.write(args[0] + EOL); System.out.println("Zapisano do pliku: " + args[0]); catch (IOException e) { System.out.println("Problem z zapisem do pliku!"); finally { if (plik!= null) plik.close(); catch (IOException e){ System.out.println("Problem z zamkni>ciem pliku!"); Zadanie 150 DaneStudentaCSV.java CSV (ang. Comma Separated Values) to format przechowywania danych w plikach tekstowych, gdzie poszczególne informacje rozdzielone s znakiem przecinka. Napisz program, który umo1liwia odczytanie z konsoli danych personalnych studenta (nazwisko, imi, wiek, kod pocztowy, miejscowo ) i dopisanie ich do pliku DaneStudenta.txt. Struktura pliku tekstowego zosta!a przedstawiona poni1ej: Badura,Monika,23,31-500,Kraków Wójcicki,Marek,22,00-986,Warszawa Maj,Robert,23,30-824,Kraków Wype!nij plik DaneStudenta.txt danymi (min. 5 pozycji). Nastpnie spróbuj otworzy go w aplikacji arkusz kalkulacyjny Excel, obs!ugujcym ten format danych. Zadanie 151 RedutaOrdonaHTML.java Odszukaj w sieci Internet opis struktury dokumentu HTML. Nastpnie napisz program, który utworzy plik RedutaOrdona.html zawierajcy zawarto pliku RedutaOrdona.txt. Poszczególne wiersze utworu wy wietl kursyw. Otwórz tak utworzony plik w dowolnej przegldarce internetowej.
MODU 9 STRUMIENIE I PLIKI 99 Zadanie 152 KonwersjaZnakowPliku.java Napisz program konwertujcy we wskazanym pliku tekstowym litery ma!e na wielkie, a wielkie na ma!e. Nazw pliku oraz jego lokalizacj odczytaj z konsoli. Zastosuj program do konwersji znaków w pliku RedutaOrdona.txt. Zadanie 153 SzyfrCezara.java Odszukaj w Internecie informacje dotyczce szyfru Cezara. Nastpnie napisz program szyfrujcy dowolny plik tekstowy. Przyk!adowe wywo!anie programu: java SzyfrCezara C:\pliki\RedutaOrdona.txt D:\wyniki\RedutaOrdonaZaszyfrowana.txt STRUMIENIE SIECIOWE Zadanie 154 ZasobySieciInternet.java Napisz program wy wietlajcy na konsoli zawarto wskazanej strony WWW. import java.net.*; public class ZasobyInternetu { String adres = "http://www.uek.krakow.pl"; try { URL url = new URL(adres); InputStream instream = url.openstream(); BufferedReader dane = new BufferedReader(new InputStreamReader(inStream)); String linia = ""; while ((linia = dane.readline())!= null) System.out.println(linia); catch (Exception e) { System.out.println(e.toString()); Zadanie 155 KursyWalutNBP.java Strona internetowa http://www.nbp.pl/kursy/kursya.html zawiera tabel rednich kursów walut obcych. Napisz program, który na podstawie danych zawartych w tabeli wy wietli na konsoli redni kurs nastpujcych walut: euro, dolar amerykaski, funt szterling, frank szwajcarski.