Soubory. Katedra po íta. Ji í Vok ínek. P edná²ka 4 B6B36PJV Programování v JAVA. Fakulta elektrotechnická ƒeské vysoké u ení technické v Praze

Podobné dokumenty
Soubory. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 12 A0B36PR1 Programování 1

Soubory. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 12 A0B36PR1 Programování 1

Část I Výjimky. Část 1 Výjimky. Výjimky a soubory. Část 2 Soubory. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Výjimky a soubory. Jiří Vokřínek. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Výjimky a soubory. Jiří Vokřínek. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

8. přednáška: Soubory a proudy

Soubor jako posloupnost bytů

Soubory Práce se soubory Čtení a zápis souboru v Javě Binární soubory Textové soubory

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Textové soubory. alg9 1

Výčtové typy Kolekce a JFC Iterátory Přehled JFC Generické typy Příklad - Spojový seznam

Výčtové typy a kolekce v Javě, generické typy

Výčtové typy Kolekce a JFC Iterátory Přehled JFC Generické typy

Výčtové typy a kolekce v Javě, generické typy

Úvod do programovacích jazyků (Java)

typová konverze typová inference

Spojové struktury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 A0B36PR1 Programování 1

GUI v Javě. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 3 A0B36PR2 Programování 2

GUI v Javě. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 3 A0B36PR2 Programování 2

P íklad t íd geometrických objekt a jejich vizualizace

Část I Příklad - Generické typy, iterátor

Část I Příklad - Generické typy, iterátor

Část I Spojové struktury

Výjimky, vý tové typy a kolekce v Jav

Práce se soubory v Javě

Specifikace systému ESHOP

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Úvod. Katedra po íta. Ji í Vok ínek. P edná²ka 1 B6B36PJV Programování v JAVA. Fakulta elektrotechnická ƒeské vysoké u ení technické v Praze

Sazba zdrojových kód. Jakub Kadl ík

1. Téma 12 - Textové soubory a výjimky

GUI v Jav a událostmi ízené programování

Objektově orientované databáze

Soubory a databáze. Soubor označuje množinu dat, která jsou kompletní k určitému zpracování a popisují vybrané vlastnosti reálných objektů

Vektory. Vektorové veli iny

Úvod do programovacích jazyků (Java)

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Teoretické minimum z PJV

Objektov orientované programování

Konceptuální modelování

Java a Caché IV: Manipulace s objekty

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Vektor náhodných veli in - práce s více prom nnými

Limity funkcí v nevlastních bodech. Obsah

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Skalární sou in. Úvod. Denice skalárního sou inu

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Transak ní zpracování I

KTE / ZPE Informační technologie

Pravd podobnost a statistika - cvi ení. Simona Domesová místnost: RA310 (budova CPIT) web:

Java Výjimky Java, zimní semestr

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

P íklad 1 (Náhodná veli ina)

6. PRÁCE S DATOVÝMI PROUDY

4.3 Operace nad ordin ln mi datov mi typy Operace nad logick m datov m typem Operace nad celo seln mi datov mi typy

Integrování jako opak derivování

UJO Framework. revoluční architektura beans. verze

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

BOZP - akcepta ní testy

InputStream. FilterInputStream

Iterator & for cyklus

7. Dynamické datové struktury

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Výjimky. v C# a Javě

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Návrh va kových prol - CamEdit Uºivatelská p íru ka

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Algoritmizace a programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Uºivatelská p íru ka Octopus

Soft Computing (SFC) 2014/2015 Demonstrace u ení sít RCE, Java aplikace

Abstraktní datové typy: zásobník

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Programování v Javě I. Leden 2008

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Derivování sloºené funkce

Základy graky. Jan Hamá ek. 13. zá í 2016

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Generické programování

Binární operace. Úvod. Pomocný text

Programování v Javě I. Únor 2009

2. Ur íme sudost/lichost funkce a pr se íky s osami. 6. Na záv r na rtneme graf vy²et ované funkce. 8x. x 2 +4

Seminář Java IV p.1/38

Kolekce, cyklus foreach

Seminá e. Ing. Michal Valenta PhD. Databázové systémy BI-DBS ZS 2010/11, sem. 1-13

Inovace výuky prostřednictvím šablon pro SŠ

5. Ř etězce (třída String)

Modelování v elektrotechnice

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Java - výjimky. private void vstup() throws IOException {... }

RMI Remote Method Invocation

Základní stavební prvky algoritmu

3 Vývojová prostředí, základní prvky jazyka Java, konvence jazyka Java

Nastavení vestav ného p evodníku Ethernet -> sériová linka ES01

Typický prvek kolekce pro české řazení

Java a XML. 10/26/09 1/7 Java a XML

PREPROCESOR POKRAČOVÁNÍ

Datová úloºi²t CESNET

Transkript:

Soubory Ji í Vok ínek Katedra po íta Fakulta elektrotechnická ƒeské vysoké u ení technické v Praze P edná²ka 4 B6B36PJV Programování v JAVA Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 1 / 45

ƒást 1 P íklad - Generické typy, iterátor Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 2 / 45

ƒást 2 Soubory Soubory Práce se soubory ƒtení a zápis souboru v Jav Binární soubory Textové soubory Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 3 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ ƒást I P íklad - Generické typy, iterátor Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 4 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Generické typy a nevýhody polymorsmu Flexibilita (znovupouºitelnost) t íd je tradi n v Jav e²ena d di ností a polymorsmem Polymorsmus nám dovoluje vytvo it t ídu (nap. n jaký kontejner), která umoº uje uloºit libovolný objekt (jako referenci na objekt typu Object) Nap. ArrayList z JFC Dynamická vazba polymorsmu v²ak neposkytuje kontrolu správného (nebo o ekávaného) typu b hem kompilace P ípadná chyba v d sledku ²patného typu se tak projeví aº za b hu programu Tato forma polymorsmu také vyºaduje explicitní p etypování objektu získaného z obecné kolekce Nap íklad zmi ovaný ArrayList pro ukládání objekt typu Object. Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 5 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Generické typy Java 5 dovoluje pouºít generických t íd a metod Generický typ umoº uje ur it typ instance t íd, které lze do kolekce ukládat Generický typ tak poskytuje statickou typovou kontrolu b hem p ekladu Generické typy p edstavují parametrizované denice t ídy typu n jaké datové poloºky Parametr typu se zapisuje mezi <>, nap íklad List<Participant> partlist = new ArrayList<Participant>(); http://docs.oracle.com/javase/tutorial/java/generics/index.html Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 6 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ P íklad generický a negenerický typ ArrayList participants; participants = new ArrayList(); participants.push(new PlayerRed()); // vlozit libovolny objekt je mozne participants.push(new Bet()); ArrayList<Participant> participants2; participants2 = new ArrayList<Participant>(); participants2.push(new PlayerRed()); // nelze prelozit // typova kontrola na urovni prekladace participants2.push(new Bet()); Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 7 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ P íklad implementace spojového seznamu T ída LinkedList pro uchování objekt Implementujeme metody push a print public class LinkedList { class ListNode { ListNode next; Object item; ListNode(Object item) {... ListNode start; public LinkedList() {... public LinkedList push(object obj) {... public void print() {... lec04/linkedlist Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 8 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ P íklad pouºití Do seznamu m ºeme p idávat libovolné objekty, nap. String Tisk seznamu v²ak realizuje vlastní metodou print LinkedList lst = new LinkedList(); lst.push("joe"); lst.push("barbara"); lst.push("charles"); lst.push("jill"); lst.print(); Vyuºití konstrukce for-each vyºaduje, aby t ída LinkedList implementovala rozhraní Iterable for (Object o : lst) { System.out.println("Object:" + o); Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 9 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Rozhraní Iterable a Iterator Rozhraní Iterable p edepisuje metodu iterator, která vrací iterátor instanci t ídy implementující rozhraní Iterator Iterator je objekt umoº ující postupný p ístup na poloºky seznamu Roz²í íme t ídu LinkedList o implementaci rozhraní Iterable a vnit ní t ídu LLIterator implementující rozhraní Iterator http://docs.oracle.com/javase/tutorial/java/javaoo/innerclasses.html public class LinkedListIterable extends LinkedList implements Iterable { private class LLIterator implements Iterator {... @Override public Iterator iterator() { return new LLIterator(start); //kurzor <- start lec04/linkedlistiterable Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 10 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Implementace rozhraní Iterator Rozhraní Iterator p edepisuje metody hasnext a next private class LLIterator implements Iterator { private ListNode cur; private LLIterator(ListNode cur) { this.cur = cur; // nastaveni kurzoru @Override public boolean hasnext() { return cur!= null; @Override public Object next() { if (cur == null) { throw new NoSuchElementException(); Object ret = cur.item; cur = cur.next; //move forward return ret; lec04/linkedlistiterable Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 11 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ P íklad vyuºití iterátoru v p íkazu for-each Nahradíme implementace LinkedList za LinkedListIterable // LinkedList lst = new LinkedList(); LinkedListIterable lst = new LinkedListIterable(); lst.push("joe"); lst.push("barbara"); lst.push("charles"); lst.push("jill"); lst.print(); for (Object o : lst) { System.out.println("Object:" + o); lec04/linkedlistdemo Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 12 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Spojový seznam specických objekt Do spojového seznamu LinkedList m ºeme ukládat libovolné objekty, coº má i p es své výhody také nevýhody: Nemáme statickou typovou kontrolu prvk seznamu Musíme objekty explicitn p etypovat, nap íklad pro volání metody tonicestring objektu Person public class Person { private final String name; private final int age; public Person(String name, int age) {... public String tonicestring() { return "Person name: " + name + " age: " + age; Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 13 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ P íklad p etypování na Person LinkedListIterable lst = new LinkedListIterable(); lst.push(new Person("Joe", 30)); lst.push(new Person("Barbara", 40)); lst.push(new Person("Charles", 50)); lst.push(new Person("Jill", 60)); for (Object o : lst) { System.out.println("Object: " + ((Person)o). tonicestring()); Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 14 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Generický typ Vyuºitím generického typu m ºeme p edepsat konkrétní typ objektu Vytvo íme proto LinkedList p ímo jako generický typ deklarací class LinkedListGeneric<E> a zám nou Object za E public class LinkedListGeneric<E> { class ListNode { ListNode next; E item; ListNode(E item) {... ListNode start public LinkedListGeneric() {... public LinkedListGeneric push(e obj) {... public void print() {... lec04/linkedlistgeneric Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 15 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Generický typ Iterable a Iterator Podobn upravíme odvozený iterátor a doplníme typ také v rozhraní Iterable a Iterator public class LinkedListGenericIterable<E> extends LinkedListGeneric<E> implements Iterable<E> { // vnitni trida pro iterator private class LLIterator implements Iterator<E> {... @Override public Iterator iterator() { return new LLIterator(start); lec04/linkedlistgenericiterable Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 16 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ Generický typ Iterator Implementace iterátoru je identická jako v p ípad LinkedListIterable private class LLIterator implements Iterator<E> { private ListNode cur; private LLIterator(ListNode cur) { this.cur = cur; @Override public boolean hasnext() { return cur!= null; @Override public E next() { if (cur == null) { throw new NoSuchElementException(); E ret = cur.item; cur = cur.next; //move forward return ret; lec04/linkedlistgenericiterable Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 17 / 45

Generické typy P íklad - Spojový seznam a vlastní iterátor P íklad - Spojový seznam a generický typ P íklad pouºití LinkedListGenericIterable<Person> lst = new LinkedListGenericIterable(); lst.push(new Person("Joe", 30)); lst.push(new Person("Barbara", 40)); lst.push(new Person("Charles", 50)); lst.push(new Person("Jill", 60)); lst.print(); for (Person o : lst) { System.out.println("Object: " + o.tonicestring()); lec04/linkedlistgenericdemo Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 18 / 45

ƒást II Soubory Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 19 / 45

Soubory a organizace dat v souborovém systému Soubor je mnoºina údaj uloºená ve vn j²í pam ti po íta e Typické operace pro soubor jsou: 1. Otev ení souboru 2. ƒtení dat 3. Zápis dat 4. Zav ení souboru P ístup k dat m (údaj m) v souboru m ºe být Sekven ní (postupný) Obvykle na pevném disku Postupné tení nebo zápis dat do souboru Náhodný (adresovatelný) Umoº uje adresovat libovolné místo v souboru podobn jako p i p ístupu do pole Zp sob p ístup k údaj m v souboru není zakódován v souboru, ale je dán programem Podobn také p ípad, zdali soubor chápeme jako textový nebo binární. Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 20 / 45

Adresa (cesta) k souboru Soubory jsou uloºeny v souborovém systému Soubory organizujeme do sloºek (adresá ), které tvo í hierarchii adresá a soubor tvo ící stromovou strukturu Lze sice vytvo it i cykly, zpravidla je to v²ak speciální p ípad. Souborový systém p edstavuje adresovatelný prostor, kde ke kaºdému souboru existuje adresa identikující v jakém adresá i (sloºce) se soubor nachází Adresa je sloºena ze jmen jednotlivých adresá odd lených znakem / Podobn jako URL nap. /usr/local/bin/netbeans-8.0 p edstavuje cestu k netbeans-8.0 soubor pro spu²t ní programu Netbeans bin adresá v adresá i local local adresá i v adresá i usr / ko enový adresá Umíst ní souboru tak m ºeme jednozna n ur it Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 21 / 45

Umíst ní souboru absolutní a relativní cesta Adresa absolutního umíst ní souboru v systému soubor za íná ko enovým adresá em / Cesta k souboru m ºe být také relativní vzhledem k n jakému pracovnímu (nap. projektovému) adresá i Speciální význam mají adresá e P íklady.. odkazuje do adresá e o úrove vý²e. je aktuální adresá /usr/local/bin/netbeans Relativní cesta vzhledem k /usr/local/tmp je../bin/netbeans Relativní cesta vzhledem k /usr/local/bin je netbeans./netbeans Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 22 / 45

Typy soubor Podle zp sobu kódování informace v souboru rozli²ujeme: Textové soubory P ímo itelné a jednodu²e editovatelné B ºným textovým editorem Binární soubory Zpravidla pot ebujeme specializovaný program pro tení, zápis a modikaci souboru P ístup k souboru tak spí²e realizujeme prost ednictvím programového rozhraní V obou p ípadech je pro vým nu souboru a jejich pouºitelnost v jiných programech klí ový konkrétní zp sob organizace údaj a informací uloºených v souborech Pouºívání standardních formát a to jak textových (nap. XML, HTML, JSON, CSV), tak binárních (nap. HDF). Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 23 / 45

Textové soubory Textový soubor je posloupnost znak len ná na ádky Zpravidla len ná na ádky. Není to nutné, ale zvy²uje itelnost a usnad uje zpracování souboru (po ádcích). EOL (End of Line) znak konce ádku EOL je platformov závislý CR Carriage Return Macintosh "\r" 0x0d LF Line Feed Unix "\n" 0x0a CR/LF MS-DOS, Windows "\r\n" 0x0d 0x0a Kaºdý znak je reprezentován jedním bajtem, p ípadn 2 nebo více bajty Viz znakové sady a kódování Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 24 / 45

Binární soubory Binární soubor je posloupnost bajt Informace v binárním souboru je kódována vnit ním kódem po íta e Do binárního souboru mohou být zapsány bajt (byte) jednoduché prom nné pole data celých objekt V Jav lze vyuºít tzv. serializace Informace o typu souboru ani o zp sobu kódování informací v n m uloºených není v souboru obsaºena. Správnou interpretaci p e teného souboru musí zajistit uºivatelský program. Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 25 / 45

Binární soubory Binární soubor je posloupnost bajt Informace v binárním souboru je kódována vnit ním kódem po íta e Do binárního souboru mohou být zapsány bajt (byte) jednoduché prom nné pole data celých objekt V Jav lze vyuºít tzv. serializace Informace o typu souboru ani o zp sobu kódování informací v n m uloºených není v souboru obsaºena. Správnou interpretaci p e teného souboru musí zajistit uºivatelský program. Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 25 / 45

P ístup k soubor m P enos informace (dat) z/do souboru lze rozd lit do n kolika vrstev Vrstva m ºe poskytovat r zný pohled na obsah souboru V základním pohledu je kaºdý soubor posloupnost byt ƒtení ze souboru Posloupnost bytů Posloupnost datových typů Program Zápis do souboru Posloupnost bytů Posloupnost datových typů Program Výhoda vrstveného p ístupu je v moºnosti jednodu²e p idávat nové zp soby zpracování dat. K dat m v souboru m ºeme p istupovat dv ma základními zp soby: sekven n a p ímým (náhodným) p ístupem Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 26 / 45

Sekven ní p ístup P i sekven ním p ístupu jsou jednotlivé byty na ítány postupn B hem na ítání byt mohou být data postupn interpretovaná Nap. po p e tení 4 byt je moºné interpretovat takovou posloupnost jako celé íslo typu int. Na aktuální pozici v souboru ukazuje tzv. kurzor Kaºdé dal²í tení ze souboru vrací p íslu²ný po et p e tených byt a o stejný po et byt je kurzor posunut P i na ítání se lze vracet pouze na za átek, nelze se vrátit nap. o n kolik byt zp t P i zápisu jsou postupn ukládány dal²í byty na konec souboru P i otev ení souboru rozli²ujeme krom otev ení pro tení také otev ení pro zápis nebo p idávání (append). Sekven ní p ístup na ítání / zápisu je moºné pouºít i pro jiné vstupy/výstupy neº soubory uloºené na disku Nap. Zpracování dat po sériovém portu, Ethernet nebo obecn data z Internetu Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 27 / 45

P ímý p ístup P i práci se soubory v p ímém p ístupu je moºné zapisovat / íst na libovolné místo v souboru Práce se souborem se tak podobá p ístupu k poloºkám v poli Kurzor lze libovoln nastavovat v rozsahu velikosti souboru (v bytech) Soubor musí být k dispozici Vhodné pro soubory, které jsou p ístupné na disku, a které lze celé kdykoliv na íst do pam ti. Vhodné pokud známe vnit ní strukturu souboru a m ºeme se p ímo odkazovat na p íslu²né místo pro aktualizaci nebo na tení p íslu²né datové poloºky https://docs.oracle.com/javase/tutorial/essential/io/rafs.html Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 28 / 45

Soubory a proudy Java rozli²uje soubory (les) a proudy (streams) Soubor je mnoºina údaj uloºená ve vn j²í pam ti po íta e Proud je p ístup (nástroj) k p enosu informaci z/do souboru, ale také z/do libovolného jiného média, které je schopné generovat nebo pojmout data jako posloupnost byt sít, sériová linka, pam, jiný program, atd. Informace m ºe mít tvar znak, byt, skupin byt, objekt,... P enos informace se d je ve více vrstvách v proudech (streams) 1. Otev ení p enosového proudu pro byty nebo znaky 2. Otev ení p enosového proudu pro datové typy Javy 3. Filtrace dat podle dal²ích poºadavk, nap. buerovaní, ádkování, atd. Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 29 / 45

Proudy v Jav (Standardní t ídy) Bytové FileInputStream / FileOutputStream DataOutputStream p enos primitivních datových typ ObjectOutputStream p enos objekt BueredOutputStream buerovaní Znakové FileReader / FileWriter BueredReader buerovaní StreamTokenizer tokenizace https://docs.oracle.com/javase/8/docs/api/java/io/streamtokenizer.html RandomAccessFile práce se soubory s náhodným p ístupem File zprácování soubor /adresá : test existence, odd lova adresá /soubor, vytvo ení, mazání, atd. Vyuºívá sluºeb opera ního systému V Jav jsou p íslu²né t ídy denovány v balíku java.io p ípadn java.nio Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 30 / 45

P íklad Soubor jako posloupnost byt Vytvo ení kopie vstupního souboru Vstupní soubor postupn na ítáme byte po bytu a ukládáme do výstupního souboru public void demostreamcopy(string inputfile, String outputfile) throws IOException { FileInputStream in = new FileInputStream(inputFile); FileOutputStream out = new FileOutputStream( outputfile); int b = in.read(); // read byte of data while (b!= -1) { out.write(b); b = in.read(); out.close(); in.close(); DemoFileStream.java Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 31 / 45

P íklad o²et ení chybových stav try { demo.demostreamcopy(args[0], args[1]); catch (FileNotFoundException e) { System.err.println("File not found"); catch (IOException e) { System.err.println("Error occured during copying"); e.printstacktrace(); P íklad spu²t ní programu java DemoCopyException in2.txt out.txt File not found java DemoCopyException in.txt out2.txt Error occured during copying java.io.ioexception: Stream Closed at java.io.fileoutputstream.write(native Method) at java.io.fileoutputstream.write(fileoutputstream.java:295) at DemoCopyException.demoStreamCopy(DemoCopyException.java:16) at DemoCopyException.main(DemoCopyException.java:24) Pro jsou chyby r zné? Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 32 / 45

P íklad DemoCopyException public void demostreamcopy(string inputfile, String outputfile) throws IOException { FileInputStream in = new FileInputStream(inputFile); FileOutputStream out = new FileOutputStream(outputFile); if (outputfile.equalsignorecase("out2.txt")) { out.close(); int b = in.read(); // read byte of data while (b!= -1) { out.write(b); b = in.read(); DemoCopyException.java Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 33 / 45

Soubor jako posloupnost primitivních typ Zápis Pro zápis hodnoty základního datového typu jako posloupnost byt p idáme dal²í vrstvu DataOutputStream String fname = args.length > 0? args[0] : "out.bin"; DataOutputStream out = new DataOutputStream( new FileOutputStream(fname)); for (int i = 0; i < 10; ++i) { double d = (Math.random() % 100) / 10.0; out.writeint(i); out.writedouble(d); System.out.println("Write " + i + " " + d); DemoFilePrimitiveTypesWrite.java Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 34 / 45

Soubor jako posloupnost primitivních typ ƒtení String fname = args.length > 0? args[0] : "out.bin"; DataInputStream in = new DataInputStream( new FileInputStream(fname)); for (int i = 0; i < 10; ++i) { int v = in.readint(); double d = in.readdouble(); System.out.println("Read " + v + " " + d); DemoFilePrimitiveTypesRead.java Co se stane kdyº zam níme po adí na ítání readint a readdouble? Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 35 / 45

Soubor primitivních typ a objekt Uvedenými metodami lze zapisovat a íst pouze tzv. serializovatelné objekty, mezi které pat í Primitivní datové typy et zce a pole primitivních typ Sloºit j²í objekty, pokud implementují rozhraní Serializable Rozhraní Serializable nep edepisuje ºádnou metodu, je zna kou, ºe objekt chceme serializovat Pro vytvo ení p íslu²né implementace pro p evod hodnot do/z posloupnosti byt. Pro serializaci musí být kaºdá datová poloºka serializovatelná nebo ozna ena, ºe nebude serializována klí ovým slovem transient https://docs.oracle.com/javase/8/docs/platform/serialization/spec/ serialtoc.html Informativní Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 36 / 45

import java.io.serializable; P íklad serializace 1/3 public class Customer implements Serializable { private String name; private String surname; private int age; public Customer(String name, String surname, int age) { this.name = name; this.surname = surname; this.age = age; Customer.java Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 37 / 45

P íklad serializace 2/3 void write(customer customer, String fname) throws IOException { try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fname))) { out.writeobject(customer); Customer read(string fname) throws IOException, ClassNotFoundException { ObjectInputStream in = new ObjectInputStream(new FileInputStream(fname)); return (Customer) in.readobject(); DemoObjectSerialization.java Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 38 / 45

P íklad serializace 3/3 Customer customer = new Customer("AAA", "BBB", 47); System.out.println("Customer: " + customer); write(customer, fname); customer = new Customer("ZZZ", "WWW", 17); System.out.println("Customer: " + customer); customer = read(fname); System.out.println("Customer: " + customer); P íklad výstupu Customer: AAA BBB age: 47 Customer: ZZZ WWW age: 17 Customer: AAA BBB age: 47 Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 39 / 45

Soubory s náhodným p ístupem 1/2 T ída RandomAccessFile pro zápis/ tení do/z libovolného místa v souboru public void write(string fname, int n) throws IOException { RandomAccessFile out = new RandomAccessFile(fname, "rw"); for (int i = 0; i < n; ++i) { out.writeint(i); System.out.println("write: " + i); out.close(); Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 40 / 45

Soubory s náhodným p ístupem 2/2 Pro p ístup na konkrétní poloºku je nutné ur it adresu poloºky v souboru jako pozici v po tu byt od za átku souboru final int SIZE = Integer.SIZE / 8; RandomAccessFile in = new RandomAccessFile(fname, "r"); for (int i = 0; i < 5; ++i) { in.seek(i * 2 * SIZE); int v = in.readint(); System.out.println("read: " + v); DemoRandomAccess.java Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 41 / 45

Textov orientované soubory P i tení a zápisu je nutné zajistit konverzi znak P íklad zápisu s vyuºitím t ídy PrintWriter Kódování public void write(string fname) throws IOException { String months[] = {"jan", "feb", "mar", "apr", "may ", "jun", "jul", "aug", "sep", "oct", "nov", "dec" ; PrintWriter out = new PrintWriter(fname, "UTF-8"); for (int i = 0; i < months.length; ++i) { out.println(months[i]); out.close(); Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 42 / 45

P íklad tení textového souboru Pro tení m ºeme vyuºít t ídy Scanner podobn jako p i tení ze standardního vstupu public void start() throws IOException { String fname = "text_file.txt"; write(fname); FileInputStream in = new FileInputStream(fname); Scanner scan = new Scanner(in); while (scan.hasnext()) { String str = scan.next(); System.out.println("Read: " + str); in.close(); DemoTextFile.java Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 43 / 45

Diskutovaná témata Shrnutí p edná²ky Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 44 / 45

Diskutovaná témata Diskutovaná témata Generický typ, Spojový seznam, iterátor Soubory a p ístup k soubor m Typy soubor (textový a binární) Práce se soubory v Jav Binární soubory Textové soubory P í²t : GUI v Jav Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 45 / 45

Diskutovaná témata Diskutovaná témata Generický typ, Spojový seznam, iterátor Soubory a p ístup k soubor m Typy soubor (textový a binární) Práce se soubory v Jav Binární soubory Textové soubory P í²t : GUI v Jav Jan Faigl, Ji í Vok ínek, 2016 B6B36PJV P edná²ka 4: Soubory 45 / 45