Seminář Java VI p.1/33

Podobné dokumenty
Proudy, Zpracovсnэ XML. Radek Koэ

Vstup/Výstup, Sokety. Duben 2012

14. Vstupy a výstupy v Javě

6. PRÁCE S DATOVÝMI PROUDY

InputStream. FilterInputStream

Práce se soubory v Javě

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

Soubor jako posloupnost bytů

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

Úvod do programovacích jazyků (Java)

Textové soubory. alg9 1

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

UNIVERZITA PARDUBICE. Fakulta elektrotechniky a informatiky. Aplikace tříd souvisejících s přenosem dat mezi operační pamětí a diskem Marek Jelínek

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

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

JAVA. Vstup a výstup

Vstupy a výstupy strana 125

7. Datové typy v Javě

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

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

KTE / ZPE Informační technologie

Programování v jazyku Java soubory a proudy

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

Úvod do programovacích jazyků (Java)

Výjimky. v C# a Javě

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

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

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

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

Programovací jazyk Java

Typický prvek kolekce pro české řazení

Abstraktní datové typy: zásobník

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

Programování v Javě I. Leden 2008

Jazyk C# (seminář 5)

typová konverze typová inference

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

Design time - vytváří se program - metadata - vytváří se např. třída. Run time - běh programu - ukládá se do paměti počítače - vytváří se např.

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

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

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

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

Ošetřování chyb v programech

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

Java Výjimky Java, zimní semestr

Datové struktury. alg12 1

Seminář Java II p.1/43

PREPROCESOR POKRAČOVÁNÍ

Java a národní prostředí

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/

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

Seminář Java IV p.1/38

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

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Programovací jazyk Java

JAVA. Vstup a výstup

KTE / ZPE Informační technologie

boolean hasnext() Object next() void remove() Kolekce

1. Programování proti rozhraní

Java - řazení objektů

7. Dynamické datové struktury

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.

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

JAVA. Vstup a výstup

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

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

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

Regulární výrazy. Vzory

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

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

Principy objektově orientovaného programování

JAVA. Ještě k funkcionálnímu programování (pokračování z předchozí přednášky)

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Iterator & for cyklus

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

Generické programování

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

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

SOUBORY, VSTUPY A VÝSTUPY

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

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

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Úvod do programovacích jazyků (Java)

RMI Remote Method Invocation

Příkazy a řídicí struktury v Javě. Tomáš Pitner, upravil Marek Šabo

Teoretické minimum z PJV

IRAE 07/08 Přednáška č. 1

Java a Caché IV: Manipulace s objekty

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

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

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

VIII. Seminář Java VIII p.1/36

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

3 KTE / ZPE Informační technologie

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

SW_10. Dekorátor - Decorator Stav - State

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

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

Transkript:

Seminář Java VI Seminář Java VI p.1/33

Rekapitulace Úvod do kontejnerů - kategorie Iterátory Rozhraní List Rozhraní Set Rozhraní Map Volba implementace Nástroje Souběžný přístup Seminář Java VI p.2/33

Obsah Vstup a výstup Koncepce proudů Práce se soubory a adresáři Binární proudy, třídy InputStream, OutputStream Znakové proudy, třídy Reader, Writer Filtrované proudy Standardní vstup a výstup Komprimace Serializace Seminář Java VI p.3/33

Koncepce v/v operací (1) Založeny na v/v proudech Plně platformově nezávislé Transparentní přístup Rozdělení znakové (Reader/Writer) binární Stream Datový proud - jakýkoliv datový zdroj nebo cíl jako objekt, schopný zpřístupnit přijmout libovolné datové bloky. Ukrývá detaily toho, co se děje s daty uvnitř skutečného vstupního nebo výstupního zařízení. Seminář Java VI p.4/33

Koncepce v/v operací (2) Koncipovány jako "stavebnice" lze vkládat do sebe a přidávat tak vlastnosti is = new InputStream(...); bis = new BufferedInputStream(is); Téměř vše je obsazaženo v balíku java.io od verze 1.4+ alternativní balík java.nio (new I/O) blíže viz. dokumentace API java.io a java.nio Seminář Java VI p.5/33

Práce se soubory Základem je třída java.io.file "brána" k fyzickým souborům/adresářům na disku používá se jak pro soubory, tak adresáře, linky i soubory identifikované UNC jmény opět platformově nezávislé transparetní odlišení systémů souborů char File.separatorChar String File.separator char File.pathSeparatorChar String File.pathSeparator System.getProperty("user.dir") - adresář uživatele pod jehož UID je proces JVM spuštěn Seminář Java VI p.6/33

Třída File (1) Vytvoření konstruktorem File(String filename) - vytvoří v aktuálním adresáři soubor s názvem filename File(File basedir, String filename) - vytvoří v adresáři basedir soubor s názvem filename File(String basedirname, String filename) - vytvoří v adresáři basedirname soubor s názvem filename File(URL url, String filename) - vytvoří soubor (soborovým file:) URL url Seminář Java VI p.7/33

Třída File (2) Testy na existence a povahy souboru boolean exist() - test na existenci souboru (nebo adresáře) boolean isfile() - test zda jde o soubor (tj. ne adresář) boolean isdirectory() - test zda jde o adresář Test práv - čtení/zápisu boolean canread() - test, zda lze soubor číst boolean canwrite() - test, zda lze do souboru zapisovat Seminář Java VI p.8/33

Třída File (3) Vytvoření souboru nebo adresáře boolean createnewfile() - (pro soubor) vrací true podaří-li se soubor vytvořit boolean mkdir() - (pro adresář) vrací true podaří-li adresář vytvořit boolean mkdirs() - vytvoří případně celou adresářovou cestu Vytvoření dočasného (temporary) souboru static File createtempfile(string prefix, String suffix) - vytvoří dočasný soubor ve standardním pro to určeném adresáři s uvedeným prefixem a suffixem v názvu static File createtempfile(string prefix, String suffix, File directory) - dtto, ale vytvoří dočasný soubor v adr. directory Seminář Java VI p.9/33

Třída File (4) Zrušení boolean delete() - zrušení souboru nebo adresáře boolean renameto(file dest) - přejmenuje soubor nebo adresář Další vlastnosti long length() - délka souboru v bajtech long lastmodified() - čas poslední modifikace souboru v ms String getname() - jen jméno souboru (tj. poslední část cesty) String getpath() - absolutní cesta k souboru i se jménem String getabsolutepath() - celá cesta k souboru i se jménem String getparent() - adresář v němž je soubor nebo adresář obsažen další vlastnostni viz dokumentace API třídy File Seminář Java VI p.10/33

Práce s adresáři Základem je opět třída File, použitelná i pro adresáře. Jak např. získat (filtrovaný) seznam souborů v adresáři? pomocí metody File[] listfiles(filefilter ff) nebo podobné File[] listfiles(filenamefilter fnf) Seminář Java VI p.11/33

Třída FilenameFilter FileFilter je rozhraní s jedinou metodou boolean accept(file pathname) obdobně FilenameFilter viz dokumentace API java.io.filenamefilter Seminář Java VI p.12/33

Příklad - FilenameFilter public class VypisAdresare { public static void main(final String[] args) { File cesta = new File("."); String[] seznam; if (args.length == 0) seznam = cesta.list(); else seznam = cesta.list(new FilenameFilter() { public boolean accept(file adresar, String fn) { String soubor = new File(fn).getName(); return soubor.indexof(args[0])!= -1; ); for(int i = 0; i < seznam.length; i++) System.out.println(seznam[i]); Seminář Java VI p.13/33

Příklad - vytvoření adresáře public class MakeDir { public static void main(string[] args) { String dirname = "adresar\\vnorenyadresar"; if (args.length!= 0) dirname = args[0]; File adresar = new File(dirName); adresar.mkdirs(); Seminář Java VI p.14/33

Práce s binárními proudy Vstupní jsou odvozeny od abstraktní třídy InputStream pole bajtů soubor objekt typu String roura sekvence proudů... Výstupní jsou odvozeny od abstraktní třídy OutputStream pole bajtů soubor roura... Seminář Java VI p.15/33

Vstupní binární proudy void close() - uzavře proud a uvolní příslušné systémové zdroje void mark(int readlimit) - poznačí si aktuální pozici (později se lze vrátit zpět pomocí reset())... boolean marksupported() - pokud je podpodporováno abstract int read() - přečte bajt. vrací -1, když už není možné číst int read(byte[] b) - přečte pole bajtů int read(byte[] b, int off, int len) - přečte pole bajtů se specifikací délky a pozice plnění pole b void reset() - vrátí se ke značce nastavené metodou mark(int) long skip(long n) - přeskočí zadaný počte bajtů Uvedené metody, kromě abstract byte read(), nemusejí být nutně v neabstraktní podtřídě překryty. Seminář Java VI p.16/33

Některé třídy odvozené od InputStream java.io.filterinputstream je bázová třída k odvozování všech vstupních proudů přidávajících vlastnost/schopnost filtrovat poskytnutý vstupní proud. BufferedInputStream - proud s vyrovnávací pamětí (je možno specifikovat její optimální velikost) java.util.zip.checkedinputstream - proud s kontrolním součtem (např. CRC32) javax.crypto.cipherinputstream - proud dešifrující data ze vstupu DataInputStream - má metody pro čtení hodnot primitivních typů java.security.digestinputstream - počítá současně i haš (digest) čtených dat, použitý algoritmus lze nastavit ProgressMonitorInputStream - přidává schopnost informovat o průběhu čtení z proudu Seminář Java VI p.17/33

Další vstupní proudy Příklad rekonstrukce objektů ze souboru FileInputStream istream = new FileInputStream("t.tmp"); ObjectInputStream p = new ObjectInputStream(istream); int i = p.readint(); String today = (String)p.readObject(); Date date = (Date)p.readObject(); istream.close(); ObjectInputStream - proud na čtení serializovaných objektů ByteArrayInputStream - proud dat čtených z pole bajtů PipedInputStream - roura napojená na "protilehlý" PipedOutputStream SequenceInputStream - proud vzniklý spojením více podřízených proudů do jednoho virtuálního Seminář Java VI p.18/33

Práce se znakovými proudy Základem je abstraktní třída Reader BufferedReader, CharArrayReader, InputStreamReader, PipedReader, StringReader LineNumberReader, FileReader, PushbackReader Seminář Java VI p.19/33

Výstupní proudy jedná se o protějšky k vstupním proudům, názvy jsou konstruovány analogicky (např. FileReader -> FileWriter) Příklady PrintStream PrintWriter Seminář Java VI p.20/33

Příklad - výpis souboru - Reader public class VypisSouboru { public static void main(string[] args) { try { String filename = "VypisSouboru.java"; if (args.length!= 0) filename = args[0]; BufferedReader in = new BufferedReader( new FileReader(filename)); String line; while ((line = in.readline())!= null) System.out.println(line); in.close(); catch(exception ex) { ex.printstacktrace(system.err); Seminář Java VI p.21/33

Příklad - kopírování souborů - Stream public class CopyFile { public static void main(string[] args) { try { FileInputStream in = new FileInputStream(args[0]); FileOutputStream out = new FileOutputStream(args[1]); byte[] bytearray = new byte[in.available()]; in.read(bytearray); out.write(bytearray); in.close(); out.close(); catch(exception ex) { ex.printstacktrace(system.err); Seminář Java VI p.22/33

Konverze mezi proudy Ze vstupního binárního proudu InputStream (čili každého) je možné vytvořit znakový Reader //nejprve binární vstupní proud //toho kódování znaků nezajímá InputStream is =... //znakový proud použije pro dekódování //standardní znakovou sadu Reader isr = new InputStreamReader(is); //sady jsou definovány v balíku java.nio Charset chrs = java.nio.charset.forname("iso-8859-2"); //použije pro dekódování jinou znakovou sadu Reader isr2 = new InputStreamReader(is, chrs); Obdobně pro výstupní proudy - lze vytvořit Writer z OutputStream. Seminář Java VI p.23/33

Standardní vstup a výstup Vstup - vrací i přijímá InputStream System.in Výstup - vrací i přijímá PrintStream System.out System.err Nastavení proudu provedeme metodou setxxx (Out,Err,In). Příklad převodu System.out na PrintWriter PrintWriter newout = new PrintWriter(System.out, true); Seminář Java VI p.24/33

Příklad - čtení ze standardního vstupu public class ReadIn { public static void main(string[] args) { try { BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String line; while((line = in.readline()).length()!= 0) System.out.println(line); catch(ioexception ioe) { ioe.printstacktrace(system.err); Seminář Java VI p.25/33

Komprimace Nástorje pro komprimaci dat jsou umístěny v balíku java.util.zip API. Čtení a zápis proudů v komprimovaném formátu GZIP a ZIP Nádstavba existujícíh tříd Funkce pro komprimaci a kontrolu dat Bajtově orientované Seminář Java VI p.26/33

Komprimace - přehled tříd CheckedInputStream - metoda getchecksum() vrací kontrolní součet vstupního proudu typu InputStream CheckedOutStream - metoda getchecksum() vrací kontrolní součet výstupního proudu typu OutputStream ZipInputStream - třída typu InflaterInputStream, obnovuje data dříve uložená ve formátu ZIP. GZIPInputStream - třída typu InflaterInputStream, obnovuje data dříve uložená ve formátu GZIP. ZipOutputStream - třída typu DeflaterOutputStream, komprimuje data do formátu ZIP. GZIPOutputStream - třída typu DeflaterOutputStream, komprimuje data do formátu GZIP. Seminář Java VI p.27/33

Příklad - komprimace (GZIP) public class GZIPCompress { public static void main(string[] args) throws IOException { BufferedReader in = new BufferedReader( new FileReader(args[0])); BufferedOutputStream out = new BufferedOutputStream( new GZIPOutputStream(new FileOutputStream(args[1]))); int b; while((b = in.read())!= -1) out.write(b); in.close(); out.close(); Seminář Java VI p.28/33

Serializace objektů (1) serializace objektu - postup, jak z objektu vytvořit sekvenci bajtů perzistentně uložitelnou na pamět ové médium (disk), a později restaurovatelnou do podoby výchozího javového objektu deserializace - zpětná rekonstrukce objektu Seminář Java VI p.29/33

Serializace objektů (2) Serializovatelný objekt musí splňovat následující podmínky musí implementovat rozhraní java.io.serializable proměnné objektu, které nemají být serializovány, musí být označeny modifikátorem transient pokud požaduje "speciální chování" při de/serializaci, musí objekt definovat metody private void readobject(objectinputstream stream) throws IOException, ClassNotFoundException private void writeobject(objectoutputstream stream) throws IOException Seminář Java VI p.30/33

Serializace objektů - příklad (1) public class Clovek implements java.io.serializable { String jmeno; protected Clovek() { public Clovek(String jmeno) { this.jmeno = jmeno; public String info() { return jmeno; Seminář Java VI p.31/33

Serializace objektů - příklad (2) public class Serializace { private static final String soubor = "clovek.dat"; public static void serializuj(clovek p) throws Exception { FileOutputStream fos = new FileOutputStream(soubor); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeobject(p); fos.close(); public static Clovek deserializuj() throws Exception { FileInputStream fis = new FileInputStream(soubor); ObjectInputStream ois = new ObjectInputStream(fis); Clovek p = (Clovek)ois.readObject(); fis.close(); return p; Seminář Java VI p.32/33

Serializace objektů - příklad (3)... public static void main(string args[]) throws Exception { if (args.length == 1) { Clovek p = new Clovek(args[0]); serializuj(p); System.out.println("Clovek (" + p.info() + ") serializovan."); else { Clovek p = deserializuj(); System.out.println("Deserializovany clovek: " + p.info()); Seminář Java VI p.33/33