Čá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

Podobné dokumenty
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

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

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

Soubor jako posloupnost bytů

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

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

Z. Kotala, P. Toman: Java ( Obsah )

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

Výjimky. v C# a Javě

Úvod do programovacích jazyků (Java)

Textové soubory. alg9 1

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

Výjimky. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

29. Výjimky, jejich vznik, vyhození, odchyt a zpracování. (A7B36PVJ)

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

Práce se soubory v Javě

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Java Výjimky Java, zimní semestr

Obsah přednášky. Výjimky, výčtové typy a kolekce v Javě. Nestandardní situace. Výjimky (Exceptions)

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

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

Výjimky. Tomáš Pitner, upravil Marek Šabo

Ošetřování chyb v programech

KTE / ZPE Informační technologie

7. Datové typy v Javě

Algoritmizace a programování

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

Úvod do programovacích jazyků (Java)

Teoretické minimum z PJV

Algoritmizace a programování

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.

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

Programování v Javě I. Leden 2008

RMI Remote Method Invocation

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

InputStream. FilterInputStream

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

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

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

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

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

Dědičnost (inheritance)

6. PRÁCE S DATOVÝMI PROUDY

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

1. Programování proti rozhraní

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

8 Třídy, objekty, metody, předávání argumentů metod

Úvod do programovacích jazyků (Java)

Regulární výrazy. Vzory

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

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

Datové struktury. alg12 1

Více o konstruktorech a destruktorech

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

PREPROCESOR POKRAČOVÁNÍ

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

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

typová konverze typová inference

Zpracování výjimečných situací

17. Projekt Trojúhelníky

Výčtový typ strana 67

Připravil: David Procházka. Programovací jazyk C++

POČÍTAČE A PROGRAMOVÁNÍ

Seminář Java II p.1/43

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

11. Přehled prog. jazyků

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

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Typický prvek kolekce pro české řazení

Práce se soubory. Úvod do programování 2 Tomáš Kühr

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

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Java Řetězce Java, zimní semestr

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Úvod do programování - Java. Cvičení č.4

Paměť počítače. alg2 1

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

PŘETĚŽOVÁNÍ OPERÁTORŮ

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Abstraktní datové typy: zásobník

VISUAL BASIC. Práce se soubory

Remote Method Invocation RMI

9. přednáška - třídy, objekty

Generické programování

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

6. Příkazy a řídící struktury v Javě

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Programování v C++ 1, 17. cvičení

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Transkript:

Část 1 a soubory Jiří Vokřínek Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 4 B0B36PJV Programování v JAVA Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 1 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 2 / 60 Část 2 Soubory Soubory Práce se soubory Čtení a zápis souboru v Javě Část I Binární soubory Textové soubory Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 3 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 4 / 60

(Exceptions) Představují mechanismus ošetření chybových (výjimečných) stavů Mechanismus výjimek umožňuje metodu rozdělit na hlavní (standardní) část a řešení nestandardní situace Umožňuje zpřehlednit kód metod Chyba nemusí znamenat ukončení programu Chybu je možné ošetřit, zotavit běh programu a pokračovat ve vykonávání dalšího kódu http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Výjimka nikoliv vyjímka výjimka označuje název děje nebo výsledku děje, je to podstatné jméno odvozené od slovesa. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 5 / 60 Nestandardní situace Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 6 / 60 Princip ošetření výjimky Vznik nestandardní situace může ukončit program Ošetřením výjimky program může pokračovat ve své standardní činnosti Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 7 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 8 / 60

(Exceptions) Mechanismus výjimek umožňuje přenést řízení z místa, kde výjimka vznikla do místa, kde bude zpracována Oddělení výkonné části od části chybu řešící Posloupnost příkazů, ve které může vzniknou výjimka, uzavíráme do bloku klíčovým slovem try Příslušnou výjimku pak zachytáváme prostřednictvím catch Metodu můžeme deklarovat jako metodu, která může vyvolat výjimku klíčovým slovem throws Java ošetření některých výjimečných situací vynucuje Reakce na očekávané chyby se vynucuje na úrovni překladu Při vzniku výjimky je automaticky vytvořen objekt, který nese informaci o vzniklé výjimce (Throwable) http://docs.oracle.com/javase/8/docs/api/java/lang/throwable.html Základní ošetření části kódu, kde může vzniknou výjimka try catch Volání příkazů/metod výkonné části dáváme do bloků příkazu try V případě vyvolání výjimky se řízení předá konstrukci ošetření výjimky catch Při předání vyvolání výjimky se ostatní příkazy v bloku try nevolají //prikazy kde muze vzniknout vyjimka catch (Exception e) { //osetreni vyjimky // prikazy Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 9 / 60 Mechanismus šíření výjimek v Javě Při vzniku výjimky hledá JVM odpovídající řešení, které je schopné výjimku ošetřit (převzít řízení): Pokud vzniká výjimka v bloku try hledá se odpovídající klauzule catch v tomto příkazu Pokud výjimka vznikne mimo příkaz try, předá se řízení do místa volání metody a pokračuje se podle předchozího bodu Pokud konstrukce pro ošetření výjimky v těle metody není, skončí funkce nestandardně a výjimka se šíří na dynamicky nadřazenou úroveň Není-li výjimka ošetřena ani ve funkci main, vypíše se a program skončí Pro rozlišení různých typů výjimek jsou v Javě zavedeny třídy. jsou instancemi těchto tříd. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 11 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 10 / 60 Základní dělení nestandardních situací (výjimek) 1. RuntimeException situace, na které bychom měli reagovat, můžeme reagovat a dokážeme reagovat Situace, kterým se můžeme vyvarovat programově např. kontrolou mezí pole nebo null hodnoty Indexování mimo rozsah pole, dělení nulou,... ArrayIndexOutOfBoundException, ArithmeticException, NullPointerException,... http://docs.oracle.com/javase/8/docs/api/java/lang/runtimeexception.html 2. Exception situace, na které musíme reagovat Java vynucuje ošetření nestandardní situace Například IOException, FileNotFoundException 3. Error situace, na které obecně reagovat nemůžeme závažné chyby Chyba v JVM, HW chyba: VirtualMachineError, OutOfMemoryError, IOError, UnknownError,... http://docs.oracle.com/javase/8/docs/api/java/lang/error.html Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 12 / 60

Příklad RuntimeException 1/3 Při spuštění sice získáme informaci o chybě, ale bez zdrojového kódu nevíme přesně co a proč program předčasně končilo java DemoException NullPointerException java DemoException 1 ArrayIndexOutOfBoundException java DemoException 1 a NumberFormatException java DemoException 1 1 program vypíše hodnotu 1 public class DemoException { public int parse(string[] args) { return Integer.parseInt(args[1]); public static void main(string[] args) { DemoException demo = new DemoException(); int value = demo.parse(args.length == 0? null : args); System.out.println("2nd argument: " + value); lec04/demoexception Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 13 / 60 Předání ošetření výjimky (Exception) výš Ošetření výjimky lze předat nadřazené metodě deklarací throws public void readdata(void) throws IOException {... Příklad RuntimeException 2/3 Explicitní kontrola parametru public class DemoExceptionTest { public int parse(string[] args) { int ret = -1; if (args!= null && args.length > 1) { ret = Integer.parseInt(args[1]); else { throw new RuntimeException("Input argument not set"); return ret; public static void main(string[] args) { DemoExceptionTest demo = new DemoExceptionTest(); int value = demo.parse(args); System.out.println("2nd argument: " + value); Neřeší však NumberFormatException lec04/demoexceptiontest Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 14 / 60 Příklad RuntimeException 3/3 Výjimku NumberFormatException odchytíme a nahradíme upřesňující zprávou Výjimku propagujeme výše prostřednictvím throw public int parse(string[] args) { if (args!= null && args.length > 1) { return Integer.parseInt(args[1]); else { throw new RuntimeException("Input argument not set"); catch (NumberFormatException e) { throw new NumberFormatException("2nd argument must be int"); lec04/demoexceptiontestthrows Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 15 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 16 / 60

Způsoby ošetření Příklad explicitní deklarace propagace výjimky - 1/2 Zachytíme a kompletně ošetříme Zachytíme, částečně ošetříme a dále předáme výše Např. Interně v rámci knihovny logujeme výjimku Ošetření předáme výše, výjimku nelze nebo ji nechceme ošetřit Bez ošetření výjimky špatně Aspoň výpis na standardní chybový výstup catch (Exception e) { e.printstacktrace(); Případně logovat (např. do souboru) v případě grafické aplikace nebo uživatelského prostředí system logger, log4j,... Hodnota 2. argumentu je pro nás klíčová, proto použijeme výjimku Exception, která vyžaduje ošetření Výjimku předáváme výš deklarací throws public int parse(string[] args) throws Exception { if (args!= null && args.length > 1) { return Integer.parseInt(args[1]); else { throw new Exception("Input argument not set"); catch (NumberFormatException e) { throw new Exception("2nd input argument must be integer"); Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 17 / 60 Příklad explicitní deklarace propagace výjimky - 2/2 Kompilace třídy však selže, neboť je nutné výjimku explicitně ošetřit DemoExceptionTestThrow.java:18: error: unreported exception Exception; must be caught or declared to be thrown int value = demo.parse(args) Proto musí být volání v bloku try int value = demo.parse(args); System.out.println("2nd argument: " + value); catch (Exception e) { System.out.println("Error: " + e.getmessage()); lec04/demoexceptiontestthrow Nebo main musí deklarovat propagaci výjimky výš public static void main(string[] args) throws Exception { lec04/demoexceptiontestthrowmain V tomto případě je použití výjimky Exception nevhodné. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 19 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 18 / 60 Kdy předávat výjimku výš? Pokud je to možné, výjimečnou situaci řešíme co nejblíže místa jejího vzniku Výjimkám typu RuntimeException můžeme předcházet NullPointerException, ArrayIndexOutOfBoundException typicky indikují opomenutí. Předávání výjimek throws se snažíme vyhnout Zejména na uživatelskou úroveň. typu Exception předáme výš pouze pokud nemá cenu výjimku ošetřovat, např. požadovanou hodnotu potřebujeme a bez ní nemá další činnost programu smysl Java při překladu kontroluje kritické části, které vyžadují ošetření nebo deklaraci předání výjimky výš Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 20 / 60

Kontrolované a nekontrolované výjimky Třída Error Kontrolované výjimky musí být explicitně deklarovány v hlavičce metody Jedná se o výjimky třídy Exception Označující se také jako synchronní výjimky Nekontrolované výjimky se mohou šířit z většiny metod, a proto by jejich deklarování obtěžovalo Jedná se o asynchronní výjimky Rozlišujeme na výjimky, které běžný uživatel není schopen ošetřit (Error) chyby, které ošetřujeme podle potřeby; podtřídy třídy RuntimeException. Představuje závažné chyby na úrovni virtuálního stroje (JVM) Nejsme schopni je opravit Třída Error je nadtřída všech výjimek, které převážně vznikají v důsledku sw nebo hw chyb výpočetního systému, které většinou nelze v aplikaci smysluplně ošetřit Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 21 / 60 Třída RuntimeException Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 22 / 60 Vytvoření vlastní výjimky Představuje třídu chyb, kterou lze úspěšně ošetřit Je třeba je očekávat jsou to asynchronní výjimky Nemusíme na ně reagovat a můžeme je propagovat výše Překladač ošetření této výjimky nevyžaduje Reagujeme na ně dle našeho odhadu jejich výskytu Pokud špatně odhadneme a nastane chyba, JVM indikuje místo vzniku chyby a my můžeme ošetření výjimky, nebo ošetření vzniku výjimky implementovat Zpravidla situace, která nikdy nenastane se jednou stane. Otázkou tak spíše je, jak často to se to stane při běžném použití programu. Prakticky není možné (vhodné) ošetřit všechny výjimky Runtime- Exception, protože to zpravidla vede na nepřehledný kód Pro rozlišení případných výjimečných stavů můžeme vytvořit své vlastní výjimky Buď odvozením od třídy Exception kontrolované (synchronní) výjimky Nebo odvozením od třídy RuntimeException asynchronní Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 23 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 24 / 60

Příklad vlastní výjimky RuntimeException Vytvoření vlastní výjimky Exception Vlastní výjimku MyRunTimeException vytvoříme odvozením od třídy RuntimeException Výjimku MyRunTimeException není nutné ošetřovat class MyRuntimeException extends RuntimeException { public MyRuntimeException(String str) { super(str); void demo1() { throw new MyRuntimeException("Demo MyRuntimeException"); lec04/myexceptions Vlastní výjimku MyException vytvoříme odvozením od třídy Exception Výjimku MyException je nutné ošetřovat, proto metodu demo2 deklarujeme s throws class MyException extends Exception { public MyException(String str) { super(str); void demo2() throws MyException { throw new MyException("Demo MyException"); lec04/myexceptions Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 25 / 60 Ošetřování různých výjimek Příslušná sekce catch ošetřuje kompatibilní výjimky Můžeme proto na různé chyby reagovat různě Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 26 / 60 Struktura a hierarchie výjimek public static void main(string[] args) { MyExceptions demo = new MyExceptions(); if (args.length > 0) { demo.demo1(); else { demo.demo2(); catch (MyRuntimeException e) { System.out.println("MyRuntimeException:" + e. getmessage()); catch (MyException e) { System.out.println("MyException:" + e.getmessage()); lec04/myexceptions Při ošetřování výjimek můžeme uplatnit dědické vztahy a hierarchii tříd výjimek Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 27 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 28 / 60

Blok finally Při běhu programu může být nutné vykonat konkrétní akce bez ohledu na vyvolání výjimky Typickým příkladem je uvolnění alokovaných zdrojů, např. souborů Příkazy, které se mají vždy provést před opuštěním funkce je možné zapsat do bloku finally Příkazy v bloku finally se provedou i když blok příkazu v try obsahuje return a k vyvolání výjimečné situace nedojde http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html Příklad try catch finally 1/2 public class BlockFinally { void causeruntimeexception() { throw new RuntimeException("RuntimeException"); void causeexception() throws MyException { throw new MyException("Exception"); void start(int v) {... public static void main(string[] args) { BlockFinally demo = new BlockFinally(); demo.start(args.length > 0? Integer.parseInt(args [0]) : 1); lec04/blockfinally Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 29 / 60 Příklad try catch finally 2/2 void start(int v) { if (v == 0) { System.out.println("v:0 call runtime"); causeruntimeexception(); else if (v == 1) { System.out.println("v:1 call exception"); causeexception(); else if (v == 2) { System.out.println("v:2 call return"); return; catch (MyException e) { System.out.println("start handle Exception"); finally { System.out.println("Leave start!"); Vyzkoušejte pro různá volání: java BlockFinally 0; java BlockFinally 1; java BlockFinally 2 lec04/blockfinally Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 31 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 30 / 60 a uvolnění zdrojů 1/2 Kromě explicitního uvolnění zdrojů v sekci finally je možné využít také konstrukce try-with-resources příkazu try Při volání finally void writeint(string filename, int w) throws IOException { FileWriter fw = null; fw = new FileWriter(filename); fw.write(w); finally { if (fw!= null) { fw.close(); totiž může dojít k výjimce při zavírání souboru a tím potlačení výjimky vyvolané při čtení ze souboru. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 32 / 60

a uvolnění zdrojů 2/2 Proto je výhodnější přímo využít konstrukce try-with-resources příkazu try void writeint(string filename, int w) throws IOException { try (FileWriter fw = new FileWriter(filename)) { fw.write(w); Část II Soubory try-with-resources lze použít pro libovolný objekt, který implementuje java.lang.autocloseable http://docs.oracle.com/javase/tutorial/essential/ exceptions/tryresourceclose.html Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 33 / 60 Soubory a organizace dat v souborovém systému Soubor je množina údajů uložená ve vnější paměti počítače Obvykle na pevném disku 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ý) 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, 2017 B0B36PJV Přednáška 4: a soubory 34 / 60 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 identifikují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 / 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 Podobně jako URL Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 35 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 36 / 60

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.. odkazuje do adresáře o úroveň výše. je aktuální adresář Příklady /usr/local/bin/netbeans Relativní cesta vzhledem k /usr/local/tmp je../bin/netbeans Relativní cesta vzhledem k /usr/local/bin je netbeans./netbeans Typy souborů Podle způsobu kódování informace v souboru rozlišujeme: Textové soubory Přímo čitelné a jednoduše editovatelné Binární soubory Běžným textovým editorem Zpravidla potřebujeme specializovaný program pro čtení, zápis a modifikaci 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, 2017 B0B36PJV Přednáška 4: a soubory 37 / 60 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, 2017 B0B36PJV Přednáška 4: a soubory 38 / 60 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, 2017 B0B36PJV Přednáška 4: a soubory 39 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 40 / 60

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 Zápis do souboru Posloupnost bytů Posloupnost bytů Posloupnost datových typů Posloupnost datových typů Program 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, 2017 B0B36PJV Přednáška 4: a soubory 41 / 60 Přímý přístup 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, 2017 B0B36PJV Přednáška 4: a soubory 42 / 60 Soubory a proudy 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 Java rozlišuje soubory ( files ) 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ř. bufferovaní, řádkování, atd. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 43 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 44 / 60

Proudy v Javě (Standardní třídy) Bytové FileInputStream / FileOutputStream DataOutputStream přenos primitivních datových typů ObjectOutputStream přenos objektů BufferedOutputStream bufferovaní Znakové FileReader / FileWriter BufferedReader bufferovaní 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 definovány v balíku java.io případně java.nio Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 45 / 60 Příklad ošetření chybových stavů 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, 2017 B0B36PJV Přednáška 4: a soubory 47 / 60 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, 2017 B0B36PJV Přednáška 4: a soubory 46 / 60 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, 2017 B0B36PJV Přednáška 4: a soubory 48 / 60

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 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, 2017 B0B36PJV Přednáška 4: a soubory 49 / 60 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, 2017 B0B36PJV Přednáška 4: a soubory 50 / 60 Příklad serializace 1/3 import java.io.serializable; 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, 2017 B0B36PJV Přednáška 4: a soubory 51 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 52 / 60

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 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, 2017 B0B36PJV Přednáška 4: a soubory 53 / 60 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"); Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 54 / 60 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 < n; ++i) { out.writeint(i); System.out.println("write: " + i); out.close(); 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, 2017 B0B36PJV Přednáška 4: a soubory 55 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 56 / 60

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, 2017 B0B36PJV Přednáška 4: a soubory 57 / 60 Diskutovaná témata 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, 2017 B0B36PJV Přednáška 4: a soubory 58 / 60 Diskutovaná témata Diskutovaná témata Shrnutí přednášky 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, 2017 B0B36PJV Přednáška 4: a soubory 59 / 60 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 4: a soubory 60 / 60