I/O (STRUMIENIE, PLIKI,...)

Podobne dokumenty
Strumienie i serializacja

Programowanie w języku Java WYKŁAD

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

1 Klasa File. 2 Writer. Programowanie w j zyku Java - Adam Krechowicz. Klasa File zapewnia podstawowe operacje na plikach

Język JAVA podstawy. Wykład 6, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wykład 4: Wejście/wyjście: strumienie Java

Java niezbędnik programisty spotkanie nr 11. Importy statyczne, wejście/wyjście, wyrażenia regularne, serializacja

STRUMIENIE DANYCH, SERIALIZACJA OBIEKTÓW

Programowanie obiektowe

Podstawy i języki programowania

Programowanie obiektowe

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Programowane refleksyjne i serializacja

Podstawy otwartych języków programowania Wyjątki i strumienie I/O

Kurs programowania. Wykład 10. Wojciech Macyna. 05 maja 2016

Programowanie obiektowe

Przygotował: Jacek Sroka 1. Java SE. Strumienie

Strumienie, pliki. Sortowanie. Wyjątki.

STRUMIENIE TEKSTOWE WEJŚCIOWE WPROWADZANIE DANYCH STRUMIENIE BAJTOWE, STRUMIENIE TEKSTOWE

Platformy Programistyczne Zagadnienia sieciowe i wątki

Biblioteki wejścia/wyjścia. Strumienie we/wy (I/O)

WSNHiD, Programowanie 2, Lab. 3. Trwałość danych

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

OPERACJE NA PLIKACH ZAGADNIENIA: MATERIAŁY:

Programowanie obiektowe

KLASY, INTERFEJSY, ITP

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

JAVA I SIECI. MATERIAŁY:

KOMUNIKACJA MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Bezpieczne uruchamianie apletów wg

K O M U N I K A C J A MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Java. Programowanie Obiektowe Mateusz Cicheński

Języki i metody programowania Java INF302W Wykład 4

Programowanie obiektowe

Inynieria oprogramowania Lecture XXX. Java TM cz IV: IO. Bartosz Walter

Strumienie, pliki. Sortowanie. Wyjątki.

Programowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe zastosowanie języka Java SE

Rozdział 7 Strumienie, operacje wejścia-wyjścia

Marcin Janic 1. Streszczenie

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Programowanie Obiektowe (Java)

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Aplikacja wielowątkowa prosty komunikator

Programowanie rozproszone w języku Java

Wykład 10: Wejście i Wyjście

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Katalog książek cz. 2

1. Co można powiedzieć o poniższym kodzie? public class A { void m(int a) { } int m(string s) { return Integer.parseInt(s); }

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Aplikacje w środowisku Java

MATERIAŁY POMOCNICZE DO ĆWICZENIA 3 Klasy i obiekty; atrybuty i metody

Komunikacja z użyciem gniazd aplikacje klient-serwer

Bezpieczeństwo w aplikacjach Java

1 Atrybuty i metody klasowe

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Programowanie w języku Java

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wykład 2. Strumienie tekstowe (wprowadzanie danych z klawiatury) i bajtowe, otwieranie strumieni poprzez sieć - obiekty URL

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

akademia androida Składowanie danych część VI

Tworzenie i wykorzystanie usług

Dokumentacja do API Javy.

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Język JAVA podstawy. Wykład 6, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

dr Krzysztof Podlaski

Wykład 7: Pakiety i Interfejsy

Wstęp do Java. Operacje Wejścia-Wyjścia Programowanie Wielowątkowe. dr Krzysztof Podlaski. Wydział Fizyki i Informatyki Stosowanej

Metody Metody, parametry, zwracanie wartości

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

Aplikacje internetowe i rozproszone - laboratorium

Podstawy i języki programowania

sieć 4) Mechanizm RMI jest zazwyczaj wykorzystywany w rozwiązaniach typu klient-serwer.

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Programowanie w Internecie. Java

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Java techniki programowania

Aplikacja wielow tkowa prosty komunikator

Strumienie tekstowe (wprowadzanie danych z klawiatury) i bajtowe, otwieranie strumieni przez sieć - obiekty URL

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Programowanie współbieżne i rozproszone

Zaawansowane aplikacje WWW - laboratorium

Łukasz Przywarty Wrocław, r. Grupa: WT/N 11:15-14:00. Sprawozdanie z zajęć laboratoryjnych: OpenSSL - API

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Wywoływanie metod zdalnych

Ćwiczenie 9 - Zaawansowane metody programowania w sieci komputerowej

Metody dostępu do danych

Programowanie obiektowe

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Java. Zadania z programowania z przykładowymi rozwiązaniami

Programowanie obiektowe

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Języki i metody programowania Java. Wykład 2 (część 2)

Transkrypt:

I/O (STRUMIENIE, PLIKI,...) ZAGADNIENIA: pakiet java.io, strumienie bajtowe, strumienie znakowe, strumienie binarne, serializacja i kompresja narzędzie jar. MATERIAŁY: http://docs.oracle.com/javase/tutorial/essential/io/ http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 1

STRUMIENIE BAJTOWE Większość operacji wejścia/wyjścia wykorzystuje klasy pakietu java.io. Strumienie bajtowe traktują dane jak zbiór ośmiobitowych bajtów. Wszystke strumienie bajtowe rozszerzają klasy InputStream (dane przychodzące do programu) lub OutputStream (dane wychodzące z programu). http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 2

STRUMIENIE BAJTOWE import java.io.fileinputstream; import java.io.fileoutputstream; import java.io.ioexception; public class CopyBytes { public static void main(string[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("input.txt"); out = new FileOutputStream("output.txt"); int c; while ((c = in.read())!= -1) { out.write(c); http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 3

STRUMIENIE BAJTOWE finally { if (in!= null) { in.close(); if (out!= null) { out.close(); Strumienie zawsze należy zamykać! Strumienie bajtowe reprezentują niskopoziomowy dostęp do danych. Dlatego w konkretnych sytuacjach warto je zastąpić przez bardziej specjalistyczne rodzaje strumieni. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 4

STRUMIENIE ZNAKOWE Strumienie znakowe automatycznie konwertują dane tekstowe do formatu Unicode (stosowanego natywnie w Javie). Konwersja jest dokonywana w oparciu o ustawienia regionalne komputera, na którym uruchomiono JVM (Wirtualną Maszynę Javy), lub jest sterowana ręcznie przez programistę. Strumienie znakowe rozszerzają klasy Reader (dane przychodzące do programu) lub Writer (dane wychodzące z programu). http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 5

STRUMIENIE ZNAKOWE import java.io.filereader; import java.io.filewriter; import java.io.ioexception; public class CopyCharacters { public static void main(string[] args) throws IOException { FileReader in = null; FileWriter out = null; try { in = new FileReader("input.txt"); out = new FileWriter("output.txt"); int c; while ((c = in.read())!= -1) { out.write(c); http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 6

STRUMIENIE ZNAKOWE finally { if (in!= null) { in.close(); if (out!= null) { out.close(); Strumienie znakowe wykorzystuję do komunikacj strumienie bajtowe, a same zajmują się konwersją danych. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 7

STRUMIENIE BUFOROWANE Strumienie znakowe buforowane umożliwiają odczytywanie tekstu linia po linii: BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new FileReader("input.txt")); out = new PrintWriter(new FileWriter("output.txt")); String l; while ((l = in.readline())!= null) { out.println(l); catch {... http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 8

STRUMIENIE BUFOROWANE Istnieją cztery klasy buforowanych strumieni: BufferedInputStream i BufferedOutputStream są strumieniami bajtowymi, podczas gdy BufferedReader i BufferedWriter odpowiadają za przesył znaków. Aby wymusić zapis danych poprzez wyjściowy, buforowany strumień, można użyć metody flush(). http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 9

SKANOWANIE Scanner pozwala na przetwarzanie tokenów (domyślnie rozdzielonych przez Character.isWhitespace(char c)): import java.io.*; import java.util.scanner; public class ScanXan { public static void main(string[] args) throws IOException { Scanner s = null; try { s = new Scanner(new BufferedReader( new FileReader("input.txt"))); while (s.hasnext()) { System.out.println(s.next()); http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 10

SKANOWANIE finally { if (s!= null) { s.close(); Obiekt należy zamknąć ze względu na strumień, z którym jest związany. Aby zmienić zachowanie obiektu Scanner, można skorzystać z metody: usedelimiter(). Przykładowo s.usedelimiter(",\\s*"); zmienia znak rozdzielający na przecinek po którym następuje dowolna liczba białych spacji. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 11

FORMATOWANIE Wyjściowe strumienie znakowe umożliwiają podstawowe formatowanie danych za pomocą kilku odmian metody print() i format(). double d = 2.0; double s = Math.sqrt(2.0); System.out.println("Pierwiastek z " + d + " to " + s + "."); Pierwiastek z 2.0 to 1.4142135623730951 System.out.format("Pierwiastek z %f to %.4f\n", d, s); Pierwiastek z 2,000000 to 1,4142 System.out.format(Locale.US, "Pierwiastek z %.1f to %.4f\n", d, s); System.out.printf(Locale.US, "Pierwiastek z %.1f to %.4f\n", d, s); Pierwiastek z 2.0 to 1.4142 Opis wszystkich możliwości formatowania jest opisany w dokumentacji klasy java.util.formatter. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 12

METODY WIELOARGUMENTOWE public static void multiint(int... ints){ for (int i=0; i<ints.length; i++) System.out.println(ints[i]); System.out.println(); for(int i: ints) System.out.println(i); public static void main(string[] args){ multiint(123,34,65,76,44,11,0); multiint(); multiint(12, 28); http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 13

ZASOBY I LOKALIZACJA import java.util.locale; import java.util.resourcebundle; public class LocalizationExample { public static void main(string[] args){ ResourceBundle rb = ResourceBundle.getBundle("resources"); for(string key: rb.keyset()) System.out.println(key + ": " + rb.getstring(key)); Przykładowy plik resources_pl.properties: KeyHello=witaj KeyWorld=\u015bwiat KeyKey=klucz http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 14

ZASOBY I LOKALIZACJA Statuczna metoda getbundle("resources") jest równoważna wywołaniu getbundle("resources", Locale.getDefault(), this.getclass().getclassloader()). i za pomocą bieżącego ClassLoadera poszukuje pliku o nazwie: basename +"_"+ language +"_"+ script +"_"+ country +"_"+ variant +".properties" Konkretna nazwa pliku jest ustalana na podstawie ustawien regionalnych systemu operacyjnego (Locale.getDefault()), n p. resources_en_us_windows_vista.properties. Metoda ta wczytuje pary (klucz,wartość). Dzięki temu można łatwo dostosować komunikaty, używane przez program do użytkownika. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 15

CLASS LOADER class NetworkClassLoader extends ClassLoader { String host; int port; public Class findclass(string name) { byte[] b = loadclassdata(name); return defineclass(name, b, 0, b.length); private byte[] loadclassdata(string name) { // wczytywanie bytecode'u klasy z określonej // lokalizacji sieciowej... http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 16

STRUMIENIE BINARNE Strumienie binarne pozwalają efektywniej zarządzać zasobami. Istnieją dwa podstawowe rodzaje strumieni: strumienie danych: DataInputStream i DataOutputStream: DataOutputStream dos = new DataOutputStream(System.out); dos.writedouble(123.12); dos.writeutf("grzegrz\u00f3\u0142ka"); dos.writeint(12345); dos.close(); strumienie obiektowe: ObjectInputStream i ObjectOutputStream: ObjectOutputStream oos = new ObjectOutputStream(System.out); oos.writeobject("grzegrz\u00f3\u0142ka"); oos.close(); http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 17

SERIALIZACJA Podstawowym zastosowaniem strumieni obiektowych jest serializacja. Klasa wspierająca serializację musi implementować interfejs Serializable. Jeśli obiekty tej klasy wymagają specjalnego traktowania podczas serializacji należy zaimplementować metody: private void writeobject(java.io.objectoutputstream out) throws IOException; private void readobject(java.io.objectinputstream in) throws IOException, ClassNotFoundException; http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 18

SERIALIZACJA public class SerialisationTest implements Serializable{ public int id; public String name; public SerialisationTest(int i, String s){ this.id = i; this.name = s; public static void main(string[] args) throws FileNotFoundException, IOException, ClassNotFoundException{ SerialisationTest st1 = new SerialisationTest(7, "Ala"); ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("output_object")); oos.writeobject(st1); oos.close(); http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 19

SERIALIZACJA SerialisationTest st2; ObjectInputStream ois = new ObjectInputStream(new FileInputStream("output_object")); st2 = (SerialisationTest)ois.readObject(); ois.close(); System.out.println(st2.id + "\t" + st2.name); Dla obiektów typu JavaBeans istnieje także możliwość serializacji tekstowej (do plików w formacie XML) z wykorzystaniem klas XMLEncoder i XMLDecoder. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 20

STRUMIENIE KOMPRESUJĄCE Strumienie kompresujące służą do bsługi formatów gzip, zip, jar. Scanner sc = new Scanner(System.in); GZIPOutputStream gos = new GZIPOutputStream( new FileOutputStream(args[0])); while(sc.hasnext()){ String s = sc.nextline() + "\n"; gos.write(s.getbytes()); sc.close(); gos.close(); GZIPOutputStream nie zapisuje danych do pliku tylko je przetwarza (kompresuje). Do zapisu wykorzystuje on strumień, którego instancje dostaje w konstruktorze (tutaj FileOutputStream). http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 21

STRUMIENIE KOMPRESUJĄCE Format ZIP obsługuje archiwa złożone z wielu plików: ZipOutputStream zos = new ZipOutputStream( new FileOutputStream("plik.zip")); for(int i=0; i<5; i++){ ZipEntry ze = new ZipEntry("plik" + i); zos.putnextentry(ze); for(int j=0; j< 1000; j++){ zos.write("ala ma kota".getbytes()); zos.closeentry(); zos.close(); ZipEntry to znacznik informujący, że następujące po nim dane należą do wskazanego pliku. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 22

ARCHIWA JAR Java wyróżnia także szczególny rodzaj archiwym ZIP: JAR (JarOutputStream, JarInputStream). Archiwa JAR zawierają pliki klas wraz z dodatkowymi zasobami potrzebnymi do działania aplikacji. Podstawowe zalety dystrybucji programów w postaci plików jar to: bezpieczeństwo: archiwa mogą być cyfrowo podpisywane, kompresja: skrócenie czasu ładowania apletu lub aplikacji, zarządzanie zawartością archiwów z poziomu języka Java, zarządzanie wersjami na poziomie pakietów oraz archiwów (Package Sealing, Package Versioning), przenośność. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 23

JAR Archiwum jar tworzy sie używając komendy jar, np: jar cf archiwum.jar klasa1.class klasa2.class... Użyte opcje: c tworzenie pliku (create), f zawartość archiwum zostanie zapisana do pliku archiwum.jar zamiast do standardowego wyjscia (stdout); Inne najczęściej używane opcje: m do archiwum zostanie dołączony plik manifest z określonej lokalizacji, np: jar cmf plik_manifest archiwum.jar *, C zmiana katologu w trakcie działania archiwizatora, np: jar cf ImageAudio.jar -C images * -C audio *. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 24

MANIFEST W archiwum jar znajduje się katalog META-INF a w nim plik MANIFEST.MF zawierający dodatkowe informacje o archiwum. Przykładowa zawartość: Manifest-Version: 1.0 Created-By: 1.5.0-b64 (Sun Microsystems Inc.) Ant-Version: Apache Ant 1.6.5 Main-Class: pl.edu.uj.if.wyklady.java.wyklad06 mówi, że po uruchomieniu archiwum wykonana zostanie metoda main(string[] args) zawarta w klasie w pakiecie pl.edu.uj.if.wyklady.java. Uruchomienie pliku jar: java -jar archiwum.jar Wyklad06 znajdującej się http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 25

ĆWICZENIA Proszę napisać program, który dla wskazanego pliku tekstowego zlicza ilość wystąpienia wszystkich znaków ('a' 20 razy, 'b' 2 razy, 'c' 1 raz, itd.), ilość wystąpienia wyrazów ( java - 4 razy, informatyka - raz), a ponadto podaje ilość lini oraz zdań. Proszę napisać strumienie (InputCesarCipher i OutputCesarCipher), które obsługują (de)szyfrują wskazany plik tekstowy używając szyfru Cesara. Strumieie powinien działać analogicznie do GZIPInputStream i GZIPOutputStream. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 26

DZIĘKUJĘ ZA UWAGĘ