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

Podobné dokumenty
Soubor jako posloupnost bytů

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

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

Textové soubory. alg9 1

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

Výjimky. v C# a Javě

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

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

Úvod do programovacích jazyků (Java)

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

Práce se soubory v Javě

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

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

InputStream. FilterInputStream

KTE / ZPE Informační technologie

Ošetřování chyb v programech

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

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

6. PRÁCE S DATOVÝMI PROUDY

7. Datové typy v Javě

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

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

Proudy, Zpracovсnэ XML. Radek Koэ

Typický prvek kolekce pro české řazení

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

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

Regulární výrazy. Vzory

Java Výjimky Java, zimní semestr

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

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

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

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

Teoretické minimum z PJV

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

Datové struktury. alg12 1

Algoritmizace a programování

Řídicí struktury. alg3 1

RMI Remote Method Invocation

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

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

Programování v Javě I. Leden 2008

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

7. Dynamické datové struktury

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

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

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

Úvod do programovacích jazyků (Java)

Seminář Java VI p.1/33

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

Úvod do programovacích jazyků (Java)

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

Seminář Java II p.1/43

17. Projekt Trojúhelníky

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

Algoritmizace a programování

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

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

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

Abstraktní datové typy: zásobník

Principy objektově orientovaného programování

PREPROCESOR POKRAČOVÁNÍ

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 )/ ;

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

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

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

Java a Caché IV: Manipulace s objekty

Remote Method Invocation RMI

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

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

Jazyk C# (seminář 5)

Generické programování

Java - řazení objektů

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Programovací jazyk Java

Spojové struktury. x, y, a, b. X1 y1 X2 y2 X3 y3. Grafické objekty bod. kružnice. obdélník. lomenáčára

5 Rekurze a zásobník. Rekurzivní volání metody

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

KTE / ZPE Informační technologie

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

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

Dědičnost (inheritance)

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

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

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/

Konstruktory a destruktory

5. přednáška - Rozklad problému na podproblémy

Vstup/Výstup, Sokety. Duben 2012

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

Iterator & for cyklus

Abstraktní třída a rozhraní

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

Java Řetězce Java, zimní semestr

Práce se soubory. Základy programování 2 Tomáš Kühr

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

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

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

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

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

Transkript:

8. přednáška: Soubory a proudy Soubor jako posloupnost bytů Ukládání/čtení primitivních typů Ukládání/čtení primitivních typů a objektů (řetězců) Ukládání/čtení objektů do souboru - serializace Obsah Algoritmizace (Y36ALG), Šumperk - 8. přednáška 1

Soubory a proudy Java rozlišuje soubory (file) a proudy (stream) soubor je množina údajů uložená ve vnější paměti počítače proudy (streams) jsou nástroje k přenosu informací např. z/do souboru, ale také do/ze sítě, paměti, jiného programu, atd. Informace může mít tvar znaků, bajtů, skupin bajtů (obrázky ), objektů,.. Přenos informace se děje dvoj/třívrstevně v proudech: 1. otevření přenosového proudu pro bajty či znaky 2. otevření přenosového proudu pro datové typy Javy 3. filtrace dat podle požadavků bufferování, řádkování, Proud bajtu či znaků Proud datových typů Filtrace Princip Algoritmizace (Y36ALG), Šumperk - 8. přednáška 2

Proudy Bajtové proudy FileInputStream přenos primitivních datových typů DataOutputStream přenos objektů ObjectOutputStream bufferování BufferedOutputStream Znakové proudy FileReader/FileWriter bufferování BufferedReader tokenizace StreamTokenizer Libovolný přístup RandomAccessFile Zpracování souborů/adresářů File Pozn: věnujeme se převážně vstupu/výstupu do a ze souborů zajišťuje java.io, cca 40 tříd Informace Algoritmizace (Y36ALG), Šumperk - 8. přednáška 3

Soubory Soubor je množina údajů uložená ve vnější paměti počítače, obvykle na disku. Typické operace pro pro práci se souborem jsou: 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í - soubory se sekvenčním přístupem umožňují pouze postupné (sekvenční) čtení nebo zápis údajů. libovolný (adresovatelný) - soubory s libovolným přístupem umožňují adresovatelnéčtení nebo zápis údaje (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 sekvenčními soubory, pro zájemce i adresovatelnými Znalost Algoritmizace (Y36ALG), Šumperk - 8. přednáška 4

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 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.close(); out.write(b); b = in.read(); Výstupní soubor Proud bajtů či znaků in.close(); // * throws IOException výjimka, vysvětlíme později Vstupní soubor Princip Algoritmizace (Y36ALG), Šumperk - 8. přednáška 5

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 pod názvem vystup.txt; pokud by soubor nebylo možné vytvořit, nastane chyba. Metody: 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. Informace Algoritmizace (Y36ALG), Šumperk - 8. přednáška 6

Výjimky vznik nestandardní situace Co by se stalo, kdybychom programově neošetřili možné nestandardní situace. metoda metoda auvajs!!!! Princip Algoritmizace (Y36ALG), Šumperk - 8. přednáška 7

Ošetření výjimky. Výjimky ideální ošetření metoda metoda ošetření výjimky Princip Algoritmizace (Y36ALG), Šumperk - 8. přednáška 8

Výjimky Při operacích se soubory (ale i při jiných operacích) mohou nastat chyby. Chyba (resp. výjimečný stav ) 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 či 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! Princip Algoritmizace (Y36ALG), Šumperk - 8. přednáška 9

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 (;;) { System.out.print("zadejte vstupní soubor: "); String jmeno = sc.nextline(); if (jmeno.equals("")) System.exit(0); Podezřelé try { místo FileInputStream in = new FileInputStream(jmeno); return in; catch (FileNotFoundException e) { Ošetření System.out.print("soubor neexistuje"); Znalost Algoritmizace (Y36ALG), Šumperk - 8. přednáška 10

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 (;;) { System.out.print("zadejte výstupní soubor: "); String jmeno = Sys.readLine(); if (jmeno.equals("")) System.exit(0); try { Podezřelé FileOutputStream out = new FileOutputStream(jmeno); místo return out; catch (FileNotFoundException e) { Ošetření System.out.print("soubor nelze vytvořit"); Příklad Algoritmizace (Y36ALG), Šumperk - 8. přednáška 11

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. Ošetření public static void main(string[] args) { FileInputStream in = vstup(); FileOutputStream out = vystup(); try { int b = in.read(); while (b!=-1) { Podezřelé out.write(b); místo b = in.read(); in.close(); out.close(); catch (IOException e) { e.printstacktrace(); Příklad Algoritmizace (Y36ALG), Šumperk - 8. přednáška 12

zadejte vstupní soubor:?? soubor neexistuje Ošetření výjimek - příklad zadejte vstupní soubor: vstup.txt zadejte výstupní soubor:... soubor nelze vytvořit zadejte výstupní soubor: vystup.txt Příklad Algoritmizace (Y36ALG), Šumperk - 8. přednáška 13

2. Soubor jako posloupnost primitivních typů 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(); System.out.print(soucet); Proud bajtu či znaků Užitečná informace Proud datových typů Algoritmizace (Y36ALG), Šumperk - 8. přednáška 14

3. Soubor primitivních typů a objektů Soubor obsahující jak primitivní typy tak objekty reprezentují třídy ObjectOutputStream 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")); System.out.print(in.readInt() + " " + in.readint()); String s1 = (String)in.readObject(); String s2 = (String)in.readObject(); System.out.print (s1 + " " + s2); Proud bajtu či znaků Užitečná informace Proud datových typů Algoritmizace (Y36ALG), Šumperk - 8. přednáška 15

Operace se souborem primitivních typů a objektů Uvedenými metodami lze zapisovat a číst pouze tzv. serializovatelné objekty; patří mezi ně implicitně např. řetězce a pole primitivních typů, jinak je třeba serializovat, tzn. implementovat rozhraníserializable! Proud bajtu či znaků Proud datových typů Užitečná informace Algoritmizace (Y36ALG), Šumperk - 8. přednáška 16

4. Ukládání objektů do souboru class ProObjekt implements Serializable { int i; String jmeno; int telefon; boolean pohlavi; double vaha; Datové složky public ProObjekt(int j) { i = j; jmeno = "JMENO-" + j; Konstruktor telefon = 111 + j; pohlavi = i%2==0; vaha = 25 - i; Jak zobrazit objekt public String tostring() { return (i + "\t" + jmeno + "\t" + telefon + "\t" + pohlavi + "\t" + vaha); Užitečná informace Algoritmizace (Y36ALG), Šumperk - 8. přednáška 17

Ukládání objektů do souboru... pokračování public static void main(string[] args) throws IOException, ClassNotFoundException { FileOutputStream fos = new FileOutputStream("objekty.bin"); ObjectOutputStream oos = new ObjectOutputStream(fos); ProObjekt[] poleobjektu = new ProObjekt[3]; for (int i = 0; i < poleobjektu.length; i++) poleobjektu[i] = new ProObjekt(i); System.out.println("Ulozeni"); for (int i = 0; i < poleobjektu.length; i++) { System.out.println(poleObjektu[i]); oos.writeobject(poleobjektu[i]); fos.close(); for (int i = 0; i < poleobjektu.length; i++) poleobjektu[i] = null; Užitečná informace Algoritmizace (Y36ALG), Šumperk - 8. přednáška 18

Ukládání objektů do souboru... pokračování FileInputStream fis = new FileInputStream("objekty.bin"); ObjectInputStream ois = new ObjectInputStream(fis); for (int i = 0; i < poleobjektu.length; i++) { poleobjektu[i] = (ProObjekt) ois.readobject(); fis.close(); System.out.println("Cteni"); for (int i = 0; i < poleobjektu.length; i++) { System.out.println(poleObjektu[i]); Ulozeni 0 JMENO-0 111 true 25.0 Užitečná informace 1 JMENO-1 112 false 24.0 2 JMENO-2 113 true 23.0 Cteni 0 JMENO-0 111 true 25.0 1 JMENO-1 112 false 24.0 2 JMENO-2 113 true 23.0 Algoritmizace (Y36ALG), Šumperk - 8. přednáška 19