Programování v jazyku Java soubory a proudy

Podobné dokumenty
Balíček java.io. je rozsáhlý, obecně koncipovaný, slouží ke vstupu, výstupu a přenosu dat.

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

6. PRÁCE S DATOVÝMI PROUDY

Práce se soubory v Javě

InputStream. FilterInputStream

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

Soubor jako posloupnost bytů

Úvod do programovacích jazyků (Java)

Proudy, Zpracovсnэ XML. Radek Koэ

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ř.

Seminář Java VI p.1/33

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

Úvod do programovacích jazyků (Java)

Teoretické minimum z PJV

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

Textové soubory. alg9 1

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

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

Programování v Javě I. Leden 2008

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

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

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

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

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

Ošetřování chyb v programech

Algoritmizace a programování

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

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

Generické programování

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

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

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

Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec. Programování v C# Soubory a regulární výrazy. Petr Vaněček 1 / 27

Jazyk C# (seminář 5)

RMI Remote Method Invocation

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

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

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

Typický prvek kolekce pro české řazení

Principy objektově orientovaného programování

typová konverze typová inference

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

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

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

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

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

Vstup/Výstup, Sokety. Duben 2012

7. Datové typy v Javě

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

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

KTE / ZPE Informační technologie

Regulární výrazy. Vzory

Java a národní prostředí

Zápis programu v jazyce C#

PREPROCESOR POKRAČOVÁNÍ

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

Seminář Java II p.1/43

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

SOUBORY, VSTUPY A VÝSTUPY

Výčtový typ strana 67

JAVA. Krátce o Reflection API

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Abstraktní datové typy: zásobník

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

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

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

Programovací jazyk Java

Výjimky. v C# a Javě

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

14. Vstupy a výstupy v Javě

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

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

Java Výjimky Java, zimní semestr

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

UJO Framework. revoluční architektura beans. verze

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/

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

1. Programování proti rozhraní

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

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

Abstraktní třída a rozhraní

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

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

VISUAL BASIC. Práce se soubory

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

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

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.

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

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

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

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

Programování v jazyce JavaScript

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

Remote Method Invocation RMI

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

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

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

Transkript:

Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Programování v jazyku Java soubory a proudy BI-PJV Programování v jazyku Java Katedra teoretické informatiky Miroslav Balík Fakulta informačních technologií České vysoké učení technické

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í nebo libovolný (adresovatelný) Soubory se sekvenčním přístupem umožňují pouze postupné (sekvenční) čtení nebo zápis údajů 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 2/44

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 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 (streams): 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í, 3/44

Textové proudy Reader a writer musí zajistit konverzi znaků Operační systém Java MS Windows, kódování UCS2 WIN 1250 kód 158 znak ž kód 382 reader UNIX, Linux, ISO 8859-2 kód 190 writer 4/44

Balíček java.io je rozsáhlý, obecně koncipovaný, slouží ke vstupu, výstupu a přenosu dat. Jeho hlavní součástí jsou třídy realizující tzv. proudy bytů resp. znaků ( byte resp. character streams ). Tyto třídy jsou potomky čtyř abstraktních tříd: InputStream, OutputStream resp. Reader, Writer. Proudy se otvírají automaticky neexistují metody open, avšak se automaticky neuzavírají nutno volat metodu close( ). V návaznosti s dalšími balíčky java.io podporuje: java.net, javax.net, javax.net.ssl - přenos po síti java.util.zip - standardní komprese dat java.util.jar - - - případně s manifestem java.nio, java.nio.channels - inovované I/O umožňuje pracovat na úrovni kanálů. 5/44

Proudění dat INPUT SOURCE OUTPUT SINK READ ZDROJ NORA PROCESS WRITE bytes chars soubor paměť roura síť konzole buffer buffer byte číslo znak řádka objekt chars bytes soubor paměť roura síť konzole 6/44

java.io java.lang Comparable<T> ObjectStream Field ObjectStream Class File tag interface Serializable byte Console Input Stream Output Stream Flushable Externalizable char FileFilter FilenameFilter File Descriptor java.lang Reader input streams Stream Tokenizer Writer Appendable output Closeable Random AccessFile DataInput DataOutput 7/44

Input Stream InputStream Closeable javax.sound.sampled File InputStream Buffered InputStream Filter InputStream ByteArray InputStream Audio InputStream javax.swing java.util.zip Data InputStream Inflater InputStream ProgressMonitor InputStream java.util.zip Piped InputStream DataInput Object InputStream ObjectInput StringBuffer InputStream ObjectStream Constants Sequence InputStream GZIP InputStream Checked InputStream java.security Zip InputStream Digest InputStream java.crypto Jar InputStream Cipher InputStream 8/44

Čtení a zápis byte streamu int b = read( ) int b 0 0 0 0 0 0 F F F F F F 00-FF F F 0 <= b <= 255 b == -1 EOF write( int b ); close( ); byte[ ] b int lng = read( byte[ ] b, ) 0 <= lng < b.length lng == -1 EOF b.length 0 write( byte[ ] b, ) ; close( ); 10/44

Reader java.nio java.lang Char Buffer Readable Closeable Reader InputStream Reader File Reader Buffered Reader LineNumber Reader Filter Reader Pushback Reader Piped Reader CharArray Reader String Reader 11/44

Čtení a zápis character streamu int c = read( ) int c 0 0 0 0 00 00 - FFFF F F F F F F F F 0 <= c <= 65535 c == -1 EOF write( c ); close( ); char[ ] c int lng = read( char[ ] c, ) 0 <= lng < c.length lng == -1 EOF c.length 0 write( c, ) ; close( ); String s write( s, ) ; close( ); 12/44

OutputStream Closeable Flushable java.lang Output Stream Appendable org.omg.corba.portable File OutputStream Buffered OutputStream Filter OutputStream ByteArray OutputStream PrintStream Output Stream java.util.zip Data OutputStream Piped OutputStream DataOutput Object OutputStream ObjectOutput ObjectStream Constants Deflater OutputStream GZIP OutputStream Checked OutputStream java.security Zip OutputStream Digest OutputStream java.crypto Jar OutputStream java.util.zip Cipher OutputStream 14/44

Writer java.lang Closeable Writer Flushable Appendable OutputStream Writer File Writer Buffered Writer Filter Writer Piped Writer CharArray Writer String Writer Print Writer 16/44

Překlad bytů na znaky InputStreamReader a OutputStreamWriter slouží jako můstky mezi bytovými a znakovými proudy a dále pro volitelný překlad. Konstruktory: InputStreamReader( InputStream in) InputStreamReader( InputStream in, String enc ) s překladem OutputStreamWriter( OutputStream out ) OutputStreamWriter( OutputStream out, String enc ) s překladem Parametr enc udává kódování např. UTF8 Pro zvýšení efektivity radno používat buffery. Např.: Reader in = new BufferedReader( new InputStreamReader( System.in) ); Writer out = new BufferedWriter( new OutputStreamWriter( System.out) ); 18/44

Interfejsy DataInput a DataOutput definují (abstraktní) metody pro čtení / zápis všech primitivů z / do proudu: boolean readboolean( ), byte readbyte( ), char readchar( ), double readdouble( ),... atd. a ještě: - void readfully( byte[ ] b ) - int readunsignedbyte( ) - int readunsignedshort( ) - String readutf( ) void writeboolean( boolean v ), void writebyte( byte v ), void writechar( char v ), void writedouble( double v )... atd. a ještě: - void write( byte[ ] b ) - void writeutf( String s ) Třídy DataInputStream, DataOutputStream a RandomAccessFile tyto interfejsy implementují, čímž umějí pracovat se všemi primitivy. 19/44

Kopírování souboru po bytech Přetížené konstruktory FileInputStream a FileOutputStream určují soubor pomocí File nebo FileDescriptor anebo přímo jménem. FileOutputStream navíc umožňuje připsat data ke konci existujícího souboru, což se určí parametrem append v konstruktoru. Příklad: try { File ifile = new File("C:\\in"); File ofile = new File("C:\\out"); FileInputStream fis = new FileInputStream( ifile ); FileOutputStream fos = new FileOutputStream( ofile ); int c; while ( ( c = fis.read( ) )!= -1 ) { fos.write(c); } fis.close( ); fos.close( ); } catch ( IOException ex ) { System.err.println( ex ); } 20/44

Kopírování textového souboru po řádcích Přetížené konstruktory BufferedReader a BufferedWriter umožňují nastavit velikost bufru. Metoda readline( ) nevrací znaky přechodu na novou řádku. Writer umožňuje připisovat ke konci existujícího souboru metodou append. BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader( new InputStreamReader( new FileInputStream( "C:\\in.txt" ))); bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( "C:\\out.txt" ))); String s = null; while ( (s = br.readline( ) )!= null ) { bw.write( s ); bw.newline( ); } } catch ( IOException ex ) { System.err.println( ex ); } finally { if ( br!= null ) br.close( ); if ( bw!= null ) bw.close( ); } 21/44

Filtrování textového souboru po řádcích class TextFilter extends LineNumberReader { String s, stop ; public TextFilter( BufferedReader in, String stop ) { super( in ); this.stop=stop; } public String readline( ) { try { while ( (s=super.readline( ) )!= null ) { if ( s.length( ) == 0 ) continue; // odstraní prázdné řádky if ( s.startswith( stop ) ) return null; // podmínka ukončení return s; } } catch ( Exception ex ) { } return null; } } 22/44

Překlad souboru Přetížené konstruktory FileReader a FileWriter určují soubor pomocí File nebo FileDescriptor anebo přímo jménem. Kopírování souboru po znacích s překladem defaultního kódu do UTF8: public static void main( String[ ] args ) throws Exception { FileReader fr = new FileReader( "Test.txt" ); OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream( "Test.UTF8" ), "UTF8" ); int c; while ( (c = fr.read( ) )!= -1 ) osw.write( c ); fr.close( ); osw.close( ); } 23/44

Seznam slov v souboru Vstup: První slovo druhé a třetí. Máma mele maso. Mleté maso. Máma a táta se učí programovat. Výstup: Mleté Máma První a druhé maso. mele programovat. se slovo táta třetí. učí 24/44

Seznam slov v souboru - Java 5 public class VypisRuznychSlovNewJava { private static Scanner scan; public static void main(string[ ] args) { SortedSet<String> slova = nactivsechnaslova(); vypisjevporadipodleabecedy(slova); }.... } SortedSet<String> možno vkládat pouze řetězce kontroluje se to při překladu, je to typově bezpečné 25/44

Seznam slov v souboru - Java 5 private static SortedSet<String> nactivsechnaslova() { SortedSet<String> slova = new TreeSet<String>(); try { scan = new Scanner(new FileInputStream("vstup.txt")); while(scan.hasnext()){ slova.add(scan.next()); //přidá další slovo, pokud se neopakuje, vkládat lze pouze //řetězce typ String } } catch (IOException ex) { System.out.println("Soubor vstup.txt nebyl nalezen."); } return slova; } 26/44

Seznam slov v souboru - Java 5 private static void vypisjevporadipodleabecedy(sortedset<string> slova) { for (Iterator<String> it = slova.iterator(); it.hasnext();) { String slovo = it.next(); System.out.println(slovo); } } Z kolekce vybíráme slova typ String, není nutné přetypovávat 27/44

Seznam slov v souboru - Java 5 private static void vypisjevporadipodleabecedy (SortedSet<String> slova) { for (String slovo : slova) { System.out.println(slovo); } } Nový cyklus foreach Tento cyklus se čte: Pro každé slovo z kolekce slova proveď jeho výpis 28/44

Třída File Objekt typu File představuje soubor resp. adresář nikoli vlastní data na lokálním disku. Umožňuje přístup, informace, manipulace a cestu absolutní či relativní k pracovnímu adresáři ( začíná-li lomítkem či nikoli ). Konstruktory jen určují jen jméno, cestu případně i formou URI. Některé důležitější metody: boolean createnewfile( ) - vytvoří nový skutečný soubor pokud neexistuje boolean mkdir( ) - vytvoří skutečný adresář String getabsolutepath( ) - zjistí absolutní cestu boolean isdirectory( ), boolean isfile( ) - zjistí typ, neexistuje-li pak false String[ ] list( ) - vytvoří seznam souborů a podadresářů v adresáři boolean exists( ) - zjistí existenci boolean canread( ), boolean canwrite( ) - zjistí možnosti práce void delete( ) - zruší soubor nebo adresář long length( ) - zjistí rozsah souboru boolean renameto ( File name ) - přejmenuje soubor resp. adresář long lastmodified( ) - zjistí čas poslední modifikace 29/44

Třída File Vytvoření adresáře a souboru, zápis dat a přejmenování : File dir1 = new File( "C:\\K\\L" ); dir1.mkdirs( ); File file1 = new File( dir, "X.txt" ); file1.createnewfile( ); PrintWriter pw = new PrintWriter( file1 ); pw.println( "blablabla" ); pw.close( ); File dir2 = new File( "C:\\K\\M" ); dir1.renameto( dir2 ); File file2 = new File( dir2, "X.txt" ); File file3 = new File( dir2, "Y.txt" ); file2.renameto( file3 ); 30/44

Rekurzivní výpis adresáře static final String spc= " "; public static void main( String[ ] args ) { dir( null, "C:\\MyDir", 0 ); } static void dir( File dir, String name, int level ) { File f = ( dir == null )? new File( name ) : new File( dir, name ); String inset = spc.substring( 0, level ); System.out.println( inset + name ); if ( f.isfile( ) ) return; String[ ] sl = f.list( ) ; for ( int i = 0; i < sl.length; i++ ) dir( f, sl[ i ], level+1 ); } 31/44

Proudění rourou Konstruktory ( nepřipojené se připojí později metodou connect( ) ): PipedInputStream( PipedOutputStream src ) PipedInputStream( ) ještě nepřipojený PipedOutputStream( PipedInputStream snk ) PipedOutputStream( ) ještě nepřipojený Příklad toku náhodných bytů rourou od producenta ke konzumentovi: class Producer extends Thread { OutputStream os; Producer( OutputStream os ) { this.os = os; } public void run( ) { for ( int i = 0; i < 10; i++ ) try { os.write( (int) ( Math.random( ) * 256) ); } catch ( IOException ex ) { } } } 32/44

Proudění rourou class Consumer extends Thread { InputStream is; Consumer( InputStream is ) { this.is = is; } public void run( ) { int i; try { while ( ( i = is.read( ) )!= -1 ) System.out.println( i ); } catch ( IOException ex ) { } } } class TestPipe { public static void main( String[ ] args ) throws Exception { PipedInputStream pi = new PipedInputStream( ); PipedOutputStream po = new PipedOutputStream( pi ); new Producer( po ).start( ); new Consumer( pi ).start( ); } } 33/44

Serializace do výstupu Objekty typu Serializable lze přenést objektovým proudem tzv. serializací, jež rozloží hodnoty jeho (nestatických) atributů na byty, přičemž modifikátory přístupu nemají vliv. Všechna pole jsou serializovatelná. Neserializují se atributy označené static či transient ani třídy ani metody. Rekurzivní probírkou referencí se serializují i všechny referované objekty tedy i velmi rozsáhlý graf. Všechny jeho objekty musí být Serializable. FileOutputStream out = new FileOutputStream( "thetime" ); ObjectOutputStream oos = new ObjectOutputStream( out ); oos.writeobject( "Today" ); oos.writeobject( new Date( ) ); oos.close( ); // event. oos.flush Každý další stav téhož objektu lze zapsat jen zavoláním oos.reset( ) před vlastním zápisem. Serializaci lze využít i pro hluboké klonování skrze ByteArray Streamů. 34/44

Deserializace vstupu je obnovení objektu ( tj. i celého grafu ) jsou-li k dispozici odpovídající třídy- kompatibilní dle serialversionuid. Deserializace nevolá konstruktory Serializable tříd, neboť by nastavily iniciální hodnoty. Volá však konstruktory nadtříd které nejsou Serializable. Nepřenesené atributy nastaví na jejich defaultní hodnoty dle jejich typu. FileInputStream in = new FileInputStream( "thetime" ); ObjectInputStream ois = new ObjectInputStream( in ); String today = ( String ) ois.readobject( ); Date date = ( Date ) ois.readobject( ); Jelikož metoda ois.readobject( ) vrací typ Object, je vhodné přetypovat. Zjistit typ lze metodou getclass( ) anebo operátorem instanceof(doporučeno). Objektové proudy implementují DataInput resp. DataOutput a tudíž lze proudem přenášet i primitivní hodnoty, řetězy a UTF. 35/44

serialversionuid Serializovatelné třídy mají identifikaci verze pomocí přiřazené konstanty serialversionuid stanovené výpočtem či přiřazením. Hodnotu serialversionuid lze zjistit programem jdk1.6\bin\serialver.exe classpath... class,... což je hešová hodnota odvozená z některých charakteristik třídy. Při serializaci se přikládá do objektového proudu viz třída java.io.objectstreamconstants. Při deserializaci se porovná s hodnotou třídy na vstupní straně. Při neshodě se vyhodí výjimka. Programátor může explicitně stanovit, že třídy jsou kompatibilní tím, že třídě vnutí určitou hodnotu atributu např: private static final long serialversionuid=333333333333333333333333l; 36/44

(De)serializace a dědičnost Pokud serializujeme instanci potomka (musí být Serializable) tak 1. buď i rodič implementuje Serializable a pak je serializován v rámci potomka, 2. nebo Předek musí mít bezparametrický konstuktor(implicitní či explicitní). Tento je volán během deserializace. 37/44

(De)serializace a dědičnost - příklad public class Rodic { public int a = 3; public Rodic(){ a = 5; } } public class Potomek extends Rodic implements Serializable{ public int p = 3; public Potomek(int pp){ p = pp; } public String tostring() { return "Potomek p " + p + " rodic a " + super.a; }} Potomek p = new Potomek(12); main p.a = 11; System.out.println("Pred serializaci " + p);...serializace p = null; // určitě tam nic nechci nechat... deserializace if(p!=null)system.out.println("po deserializaci " + p); Pred serializaci Potomek p 12 rodic a 11 Po deserializaci Potomek p 12 rodic a 5 38/44

Naše vlastní ovládání serializace a deserializace (De)serializace funguje automaticky, ale výběr a pořadí lze ovládat připsáním dvou metod do serializovatelné třídy class A implements Serializable { static int i = 3; // neserializuje se transient int j = 5; // neserializuje se double d = 1.41; private void writeobject( ObjectOutputStream oos ) throws IOException { oos.writeint( i ); // serializuje se oos.defaultwriteobject( ); // serializuje normálně tj. jen d } private void readobject( ObjectInputStream ois ) throws IOException, ClassNotFoundException { i = ois.readint( ); // deserializuje se ois.defaultreadobject( ); // deserializuje normálně tj. jen d j = -1; // bez přenosu jen nastavení }} 39/44

java.io.externalizable Pro realizaci vlastních představ lze implementovat třídu tímto interfejsem, definovat explicitní public konstruktor bez parametrů a dvě metody, které jsou plně zodpovědné za ser-deser objektu i dat nadtříd. public void writeexternal( ObjectOutput stream ) throws IOException { stream.writeint( i ); stream.writeobject( "Well done." ); } public void readexternal( ObjectInput stream ) throws IOException, ClassNotFoundException { i = stream.readint( ); String msg = ( String ) ( stream.readobject( ) ); System.out.println( msg ); } Externalizovaný vstup používá konstruktor, serializovaný nikoli. Externalizace je rychlejší než serializace, neboť JVM neanalyzuje strukturu. 40/44

Komprese Lze vytvořit standardní soubor.zip,.gzip nebo.jar, který je čitelný standardními programy - např. WinZip. Kompresi provádí Deflater. OutputStream os = new FileOutputStream( "C:\\data.zip" ); ZipOutputStream zos = new ZipOutputStream( os ); ZipEntry ze1 = new ZipEntry( "dir1 \\ dir2 \\ YY" ); zos.putnextentry( ze1 ); for ( int i = 0; i < 10000; i++ ) { zos.write( i ); } ZipEntry z2 = new ZipEntry( "dir1 \\ ZZ" ); zos.putnextentry( ze2 ); for ( int i = 0; i < 10000; i++ ) { zos.write( i ); }... zos.close(); 41/44

Dekomprese Takto lze dekomprimovat standardní.zip,.gzip a.jar. Dekompresi provádí Inflater. InputStream is = new FileInputStream( "C:\\data.zip" ); ZipInputStream zis = new ZipInputStream( is ); ZipEntry ze; int i; while ( ( ze = zis.getnextentry( ) )!= null ) { while ( ( i = zis.read( ) )!= -1 ) { System.out.print( i + " " ); } } zis.close( ); 42/44

ZipFile a ZipEntry Uložení entry a dat je patrně různé při kompresi ZipOutputStreamem a některými oblíbenými programy např. WinZip 7.0. Pro čtení a dekompresi je pak třeba použít ZipFile. ZipFile zf = new ZipFile ( "C:\\windata.zip" ); Enumeration en = zf.entries( ); while ( en.hasmoreelements( ) ) { System.out.print( en.nextelement( ) ; } ZipEntry ze = zf.getentry( "dir1 / ZZ" ); InputStream is = zf.get InputStream( ze ) ; int i; while ( ( i = zis.read( ) )!= -1 ) { System.out.print( i + " " ) ; } zis.close( ) ; zf.close( ) ; 43/44

Třída RandomAccessFile Umožňuje libovolný přístup, čtení, zápis i připisování jakoby bytového pole realizovaného na periferním zařízení. Konstruktory mají mody: r, rw pro čtení i zápis, rws, rwd pro synchonizovanou aktualizaci bratra. Instanční metody: void close( ) uzavře soubor long getfilepointer ( ) - vrátí pointer void seek ( long pos ) - nastaví pointer read ( ), readxxx( ), readline různé způsoby čtení write ( ), writexxx( ) - různé způsoby psaní long length ( ) - zjistí rozsah souboru void setlength ( long newlength ) - změní rozsah souboru int skipbytes ( int n ) - přeskočí FileChannel getchannel ( ) vrátí kanál bratra FileDecriptor getfd ( ) umožňuje připojení a synchronizaci bratra 44/44