Soubor jako posloupnost bytů

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

Textové soubory. alg9 1

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

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

Výjimky. v C# a Javě

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

Úvod do programovacích jazyků (Java)

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

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

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

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

KTE / ZPE Informační technologie

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

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

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

Teoretické minimum z PJV

Datové struktury. alg12 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é

Ošetřování chyb v programech

InputStream. FilterInputStream

6. PRÁCE S DATOVÝMI PROUDY

Práce se soubory v Javě

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

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

Programování v Javě I. Leden 2008

Řídicí struktury. alg3 1

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

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

Java Výjimky Java, zimní semestr

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

Regulární výrazy. Vzory

RMI Remote Method Invocation

17. Projekt Trojúhelníky

Úvod do programovacích jazyků (Java)

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

Seminář Java II p.1/43

Algoritmizace a programování

Dědičnost (inheritance)

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

7. Dynamické datové struktury

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

Algoritmizace a programování. Terminálový vstup a výstup

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

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

Výčtový typ strana 67

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Úvod do programovacích jazyků (Java)

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Algoritmizace a programování

Vytváření a použití knihoven tříd

7. Datové typy v Javě

Principy objektově orientovaného programování

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

KTE / ZPE Informační technologie

Generické programování

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Spojové struktury. Spojová struktura (linked structure):

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

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.

PREPROCESOR POKRAČOVÁNÍ

Třída jako zdroj funkcí

VISUAL BASIC. Práce se soubory

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

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

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

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

Více o konstruktorech a destruktorech

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

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

Typický prvek kolekce pro české řazení

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

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Jazyk C++ II. Výjimky

Java Řetězce Java, zimní semestr

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

typová konverze typová inference

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

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

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Programovací jazyk Java

- jak udělat konstantu long int: L long velka = 78L;

3 KTE / ZPE Informační technologie

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

Podmínky na zápočet. Java, zimní semestr

3. Třídy. Základní pojmy objektového programování. Třídy

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

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

Projekty pro výuku programování v jazyce Java

Zápis programu v jazyce C#

Soketové připojení Klient InetAddress getbyname() UnknowHostException SecurityException Socket getinputstream() getoutputstream() IOException Server

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

Rozklad problému na podproblémy

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/

Transkript:

Soubory Soubor je množina údajů uložená ve vnější paměti počítače, obvykle na disku Pro soubor jsou typické tyto operace. otevření souboru čtení údaje zápis údaje uzavření souboru Přístup k údajům (čtení nebo zápis) může být: sekvenční nahodilý Soubory se sekvenčním přístupem (sekvenční soubory) umožňují pouze postupné (sekvenční) čtení nebo zápis údajů Soubory s nahodilým přístupem umožňují nahodilé čtení nebo zápis udaje (podobně jako pole) Způsob přístupu k údajům v souboru není zakódován v souboru, ale je dán programem Zde se budeme zabývat pouze sekvenčními soubory alg8 1

Soubor jako posloupnost bytů V jazyku Java slouží pro práci se soubory třídy definované v balíku java.io Soubor jako posloupnost bytů reprezentují třídy: FileInputStream vstupní soubor (bude se z něj číst) FileOutputStream výstupní soubor (bude se do něj zapisovat) Příklad: kopie souboru package alg8; import java.io.*; public class Kopie1 { public static void main(string[] args) throws IOException { FileInputStream in = new FileInputStream("vstup.txt"); FileOutputStream out = new FileOutputStream("vystup.txt"); int b = in.read(); while (b!=-1) { out.write(b); b = in.read(); out.close(); in.close(); alg8 2

Soubor jako posloupnost bytů Komentář k příkazům FileInputStream in = new FileInputStream("vstup.txt"); vytvořený objekt in reprezentuje vstupní soubor uložený na disku v aktuálním adresáři pod názvem vstup.txt; pokud takový soubor neexistuje, nastane chyba FileOutputStream out = new FileOutputStream("vystup.txt"); vytvořený objekt out reprezentuje výstupní soubor, který bude uložen do aktuálního adresáře e pod názvem vystup.txt; pokud by soubor nebylo možné vytvořit, nastane chyba b = in.read(); ze souboru in se přečte jeden byte (číslo v rozsahu 0..255) a uloží do b; není-li v souboru žádný nepřečtený byte, výsledkem metody je 1 out.write(b); do souboru out se zapíše jeden byte s hodnotou b out.close(); in.close(); uzavření souborů in a out alg8 3

Výjimky Při operacích se soubory (ale i při jiných operacích) mohou nastat chyby Chyba při provádění programu v jazyku Java nemusí znamenat ukončení programu chybu lze ošetřit a pokračovat dál K ošetření chyb slouží mechanismus výjimek (exceptions) Princip výjimek v jazyku Java: libovolná metoda (konstruktor, funkce) může skončit standardně (proběhla-li operace bez chyby) nebo nestandardně vyhozením (vyvoláním) výjimky určitého typu (v případě, že nastala chyba) pokud příkaz skončil vyhozením výjimky, další příkazy se neprovedou a řízení se předá konstrukci ošetřující výjimku daného typu (s touto konstrukcí se seznámíme později) pokud taková konstrukce v těle funkce (metody, konstruktoru) 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 je v jazyku Java zavedena řada knihovních tříd, výjimky jsou instancemi těchto tříd alg8 4

Neošetření výjimek Příklady operací, které mohou skončit vyhozením výjimky: FileInputStream in = new FileInputStream( vstup.txt ); pokud soubor neexistuje, vyhodí se výjimka typu FileNotFoundException FileOutpuyStream out = new FileOtputStream(...); pokud soubor nelze vytvořit (např. je zadaná špatná cesta), vyhodí se výjimka FileNotFoundException b = in.read(); out.write(b); nepodaří-li se data přečíst nebo zapsat, vyhodí se výjimka IOExcpetion Jestliže funkce obsahuje deklarace a příkazy, které mohou vyhodit výjimky a tyto výjimky nejsou ve funkci ošetřeny, musí být seznam typů výjimek, které se mohou z funkce šířit, uveden v hlavičce funkce public static void main(string[] args) throws FileNotFoundException, IOException {... Výjimka FileNotFoundException je speciálním druhem (podtřídou) výjimky IOException předchozí hlavičku můžeme zkrátit: public static void main(string[] args) throws IOException Všechny třídy výjimek jsou podtřídami třídy Exception alg8 5

Ošetření výjimek Chceme-li ošetřit výjimku, která může vzniknout při provádění určité operace, je třeba operaci vložit do bloku try, ke kterému je připojen blok (klauzule) catch ošetřující (zachytávající) výjimky daného typu Příklad: funkce, která si vyžádá zadání jména vstupního souboru z klávesnice a pokud soubor s daným jménem neexistuje, proces se opakuje (při zadání prázdného jména program skončí) static FileInputStream vstup() { for (;;) { Sys.p("zadejte vstupní soubor: "); String jmeno = Sys.readLine(); if (jmeno.equals("")) System.exit(0); try { FileInputStream in = new FileInputStream(jmeno); return in; catch (FileNotFoundException e) { Sys.pln("soubor neexistuje"); alg8 6

Ošetření výjimek Pokračování příkladu: napíšeme podobnou funkci pro zadání výstupního souboru a obě funkce použijeme ve druhé verzi programu pro kopii souboru (třída Kopie2) static FileOutputStream vystup() { for (;;) { Sys.p("zadejte výstupní soubor: "); String jmeno = Sys.readLine(); if (jmeno.equals("")) System.exit(0); try { FileOutputStream in = new FileOutputStream(jmeno); return in; catch (FileNotFoundException e) { Sys.pln("soubor nelze vytvořit"); alg8 7

Ošetření výjimek V hlavní funkci main ošetřime výjimku typu IOException, která může vzniknout při provádění metod read, write a close public static void main(string[] args) { FileInputStream in = vstup(); FileOutputStream out = vystup(); try { int b = in.read(); while (b!=-1) { out.write(b); b = in.read(); in.close(); out.close(); catch (IOException e) { e.printstacktrace(); alg8 8

Argumenty příkazového řádku Provedení programu v jazyku Java se zadá příkazovým řádkem java Program Příkazový řádek může obsahovat další parametry (argumenty) java Program arg0 arg1... Argumenty příkazového řádku jsou přístupné hlavní funkcí main prostřednictvím jejího parametru, kterým je reference pole řetězců public static main(string[] args) Příklad: je-li provedení programu zadáno příkazovým řádkem java Program prvni druhy treti pak v hlavní funkci main třídy Program platí: hodnotou args[0] je řetězec prvni hodnotou args[1] je řetězec druhy hodnotou args[2] je řetězec treti hodnotou args.length je 3 alg8 9

Zadání souborů příkazovým řádkem public class Kopie3 { public static void main(string[] args) { if (args.length<2) { Sys.pln("použití: Kopie3 <vstup> <výstup>"); return; try { FileInputStream in = new FileInputStream(args[0]); FileOutputStream out = new FileOutputStream(args[1]); int b = in.read(); while (b!=-1) { out.write(b); b = in.read(); out.close(); in.close(); catch (Exception e) { e.printstacktrace(); alg8 10

Další verze kopie souboru public class Kopie4 { public static void main(string[] args) { if (args.length<2) { System.out.println("použití: Kopie4 <vstup> <výstup>"); return; try { FileInputStream in = new FileInputStream(args[0]); FileOutputStream out = new FileOutputStream(args[1]); while (in.available()>0) { out.write(in.read()); out.close(); in.close(); catch (Exception e) { e.printstacktrace(); Poznámka: metoda available vrací počet nepřečtených bytů souboru alg8 11

Soubor jako posloupnost primitivních typů Soubor typu FileOutputStream je z hlediska operací posloupnost prvků typu byte Soubor jako posloupnost primitivních typů reprezentují třídy DataOutputStream a DataInputStream Příklad: program, který vytvoří soubor obsahující 100 náhodných čísel typu double a pak soubor přečte a vypíše součet čísel public class Cisla { public static void main(string[] args) throws Exception { DataOutputStream out = new DataOutputStream( new FileOutputStream("temp.bin")); for (int i=0; i<100; i++) out.writedouble(math.random()); out.close(); DataInputStream in = new DataInputStream( new FileInputStream("temp.bin")); double soucet = 0; while (in.available()>0) soucet = soucet + in.readdouble(); Sys.pln(soucet); alg8 12

Operace se souborem primitivních typů DataOutputStream void writetyp(typ x) throws IOException do souboru zapíše hodnotu x primitivního typu Typ příklad: void writeint(int x) throws IOException void writedouble(double x) throws IOException... DataInputStream Typ readtyp() throws EOFException, IOException ze souboru přečte hodnotu primitivního typu Typ a vrátí ji jako výsledek výjimka EOFException vznikne tehdy, když v souboru již není dostatečný počet bytů tvořících hodnotu daného typu příklad: int readint() throws EOFException, IOException double readdouble() throws EOFException, IOException... Při čtení souboru je třeba dodržet stejné pořadí typů, jaké bylo při vytváření souboru alg8 13

Soubor primitivních typů a objektů Soubor obsahující jak primitivní typy tak objekty reprezentují třídy ObjectOtputStream a ObjectInputStream Příklad: program, který vytvoří soubor obsahující dvě hodnoty typu int a dva řetězce, a pak soubor přečte a vypíše public class CislaRetezce { public static void main(string[] args) throws Exception { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("temp.bin")); out.writeint(1); out.writeint(2); out.writeobject("prvni retez"); out.writeobject("druhy retez"); out.close(); ObjectInputStream in = new ObjectInputStream( new FileInputStream("temp.bin")); Sys.pln(in.readInt()+" "+in.readint()); String s1 = (String)in.readObject(); String s2 = (String)in.readObject(); Sys.pln(s1+" "+s2); alg8 14

Operace se souborem primitivních typů a objektů Pro zápis hodnot primitivních typů do souboru typu ObjectOutputStream slouží stejné metody, jako pro zápis do souboru typu DataOutputStream Pro čtení hodnot primitivních typů ze souboru typu ObjectInputStream slouží stejné metody, pro pro čtení ze souboru DataInputStream Zápis objektu do souboru ObjectOutputStream: void writeobject(object o) throws IOException a další Připomenutí: hodnotou parametru (proměnné) typu Object může být reference objektu libovolné třídy Čtení objektu ze souboru ObjectInputStream: Object readobject() throws IOException a další obvykle je třeba znát typ přečteného objektu a vrácenou referenci přetypovat Při čtení souboru je třeba dodržet stejné pořadí typů, jaké bylo při vytváření souboru Uvedenými metodami lze zapisovat a číst pouze tzv. serializovatelné objekty (patří mezi ně např. řetězce a pole primitivních typů) alg8 15