6. PRÁCE S DATOVÝMI PROUDY

Podobné dokumenty
Práce se soubory v Javě

InputStream. FilterInputStream

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

Textové soubory. alg9 1

Úvod do programovacích jazyků (Java)

Soubor jako posloupnost bytů

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

Programování v Javě I. Leden 2008

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

Proudy, Zpracovсnэ XML. Radek Koэ

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

Seminář Java VI p.1/33

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

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

OOPR_05. Případové studie

7. Datové typy v Javě

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

KTE / ZPE Informační technologie

Seminář Java II p.1/43

Typický prvek kolekce pro české řazení

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

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

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

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

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

Vstup/Výstup, Sokety. Duben 2012

Java Výjimky Java, zimní semestr

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

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

KTE / ZPE Informační technologie

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

Ú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

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

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

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

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

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

typová konverze typová inference

Ošetřování chyb v programech

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

Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

Teoretické minimum z PJV

14. Vstupy a výstupy v Javě

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

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

SOUBORY, VSTUPY A VÝSTUPY

Výčtový typ strana 67

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

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

Algoritmizace a programování

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

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

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

ADT/ADS = abstraktní datové typy / struktury

Regulární výrazy. Vzory

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

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

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

Zápis programu v jazyce C#

Řídicí příkazy KAPITOLA 3. Vstup znaků z klávesnice

Úvod do programovacích jazyků (Java)

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

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

7. Statické prvky třídy

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

Abstraktní datové typy: zásobník

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

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

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

20. Projekt Domácí mediotéka

Programování v jazyku Java soubory a proudy

Java - řazení objektů

Datové struktury. alg12 1

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

Algoritmizace a programování

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

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

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

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

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

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

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

Funkční objekty v C++.

C# konzole Podíl dvou čísel, podmínka IF

17. Projekt Trojúhelníky

Iterator & for cyklus

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

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Principy objektově orientovaného programování

PREPROCESOR POKRAČOVÁNÍ

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

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

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Výjimky. v C# a Javě

Transkript:

6. PRÁCE S DATOVÝMI PROUDY Balík java.io obsahuje třídy, které slouží pro zpracování datových výstupů a vstupů. Pro obvyklou práci se soubory zde můžeme najít třídy File a RandomAccessFile. Většina tříd se však věnuje práci s datovými proudy. A to jak binárními jejichž hlavní zastánci jsou třídy OutputStream a InputStream, tak i znakovými jejichž hlavní třídy jsou Writer a Reader. Od hlavních tříd je pak odvozena řada potomků, kteří se specializují na určité datové proudy, například balík java.util.zip obsahuje proudy pro práci s komprimovanými daty. V následujících podkapitolách můžete najít stručný popis hlavních tříd s některými jejich metodami, pro přehlednost nejsou uvedeny deklarované výjimky jednotlivých metod. TŘÍDA FILE Třída File umožňuje nezávisle na platformě definovat názvy souborů a adresářů. Dále nabízí metody pro ověření existence, možnosti přístupu (čtení/zápis), výpis souboru v adresáři, vytváření adresářů, přejmenování adresářů/souborů a jejich mazání. public boolean exist() - test zda soubor/adresář existuje, public boolean isdirectory() - test na adresář, public boolean isfile() - test na soubor, public boolean canread() - test na čtení souboru, public boolean canwrite() - test na zápis do souboru, public String getname() - vrací jméno souboru zbavené jmen adresářů, public String getpath() - vrací jméno souboru s kompletní cestou, public String getparent() - vrací kompletní cestu k souboru, public long length() - vrací délku souboru, public boolean mkdir() - vytvoří adresář, public boolean mkdirs() - vytvoří adresář i s podadresáři, public boolean delete() - smaže soubor/adresář, public boolean renameto(file cíl) - přejmenuje soubor, public String[] list() - zjistí všechny soubory/adresáře odpovídající zadanému jménu při vytvoření objektu. File soubor = new File("soubor.txt"); System.out.println("Délka souboru: " + soubor.length());

TŘÍDA RANDOMACCESSFILE Tato třída umožňuje náhodný přístup k souboru a práci s ním. Otevření souboru se provede při vytváření objektu konstruktorem. Ve třídě RandomAccessFile jsou definovány dva veřejné konstruktory: public RandomAccessFile(String soubor, String mód); public RandomAccessFile(File soubor, String mód); Parametr mód může být buď "r" pro otevření souboru jen pro čtení, nebo "rw" pro otevření souboru pro zápis i čtení. Po otevření souboru je vždy nastaveno ukazovátko na začátek souboru, a to v obou módech. Ani jeden mód neruší obsah souboru. public native long getfilepointer() - vrací aktuální pozici v souboru, public native long length() - zjistí délku souboru, public native void seek(long poz) - nastaví pozici v souboru na poz, public native void close() - zavře soubor, public native int read() - načte jeden byte, public int read(byte b[]) - načte b.length bytů, public final boolean readboolean(), byte readbyte(), char readchar(),... - načte primitivní datový typ, public final String readline() - načte řetězec v Unicode, public final String readutf() - načte řetězec v UTF kódování, public native void write(int b) - zapíše byte(!), public void write(byte b[]) - zapíše b.length bytů, public final void writeboolean(boolean v), void writebyte(byte v), void writechar(char v),... - zapíše primitivní datový typ, public final void writebytes(string s) - zapíše řetězec jako sled bytů, public final void writechars(string s) - zapíše řetězec jako sled znaků, public final void writeutf(string s) - zapíše řetězec v kódování UTF. import java.io.*; public class KopirovaniSouboru { public static void main(string[] argv) throws IOException {

if (argv.length!= 2) return; File soubor1 = new File(argv[0]); File soubor2 = new File(argv[1]); if (!soubor1.isfile()) return; if (soubor2.exists()) soubor2.delete(); RandomAccessFile zdroj = new RandomAccessFile(soubor1,"r"); RandomAccessFile cil = new RandomAccessFile(soubor2,"rw"); for (int n = 0; n < soubor1.length(); n++) cil.writebyte(zdroj.readbyte()); zdroj.close(); cil.close(); TŘÍDA INPUTSTREAM Abstraktní třída InputStream je rodičovskou třídou všech vstupních bytových datových proudů. Definuje základní metody pro jejich zpracování. public InputStream() - veřejný konstruktor, public abstract int read() - načte byte, public int read(byte b[]) - načte b.length bytů, public void close() - zavře vstupní datový proud, public long skip(long n) - přeskočí n bytů na vstupu, public boolean marksupported() - vrací true pokud vstupní datový proud podporuje "značkování", public synchronized void mark(int limit) - nastaví značku v datovém proudu, public synchronized void reset() - vrací se zpět na značku. Metodou mark() si lze označit aktuální pozici ve vstupním proudu a metodou reset() se lze pak na tuto pozici vrátit. Pokud přesáhne počet načtených bytů hodnotu, kterou udává parametr limit metody mark, je značka zrušena. Tyto dvě metody lze však použít pouze tehdy, vrátí-li metoda marksupported() hodnotu true. Od abstraktní třídy InputStream jsou pak odvozeny například třídy:

FileInputStream - umožňuje přístup k souborům na nízké úrovni, proto je používaná pro vlastní čtení metodami jiných tříd, například třídou DataInputStream. FilterInputStream - poskytuje metody, které lze použít pro filtrování dat ze vstupního proudu. Vlastní filtrování však provádí její potomci. Mezi ně patří např. již zmiňovaná třída DataInputStream. PipedInputStream - slouží k vytvoření roury pro komunikaci mezi vlákny. TŘÍDA OUTPUTSTREAM OutputStream je abstraktní třída definující metody pro bytový výstupní proud. Je rodičovskou třídou všech výstupních proudů. public OutputStream() - veřejný konstruktor, public abstract void write(int b) - zapíše byte(!), public void write(byte b[]) - zapíše b.length bytů, public void flush() - vyprázdní výstupní vyrovnávací paměť, public void close() - zavře datový proud. Mezi potomky třídy OutputStream patří např. FilterOutputStream, FileOutputStream či PipedOutputStream. Tyto třídy jsou obdobou tříd odvozených od třídy InputStream. TŘÍDA READER Reader je abstraktní třída definující metody všech znakově orientovaných vstupních datových proudů. public boolean ready() - zjistí, zda je k dispozici další znak, public int read() - načte jeden znak, public int read(char c[]) - načte c.length znaků, public abstract void close() - zavře vstupní datový proud, public long skip(long n) - přeskočí (ignoruje) n znaků na vstupu, public boolean marksupported() - vrací true pokud vstupní datový proud podporuje "značkování", public void mark(int limit) - nastaví značku v datovém proudu, public void reset() - vrací se zpět na značku. Funkce metod je obdobná jako u třídy InputStream. TŘÍDA WRITER Writer je abstraktní třída definující metody všech znakově orientovaných výstupních datových proudů.

public void write(int c) - zapíše jeden znak, public void write(char c[]) - zapíše c.length znaků, public void write(string s) - zapíše řetězec, void flush() - vyprázdní výstupní vyrovnávací paměť, public abstract void close() - zavře datový proud. Funkce metod je obdobná jako u třídy OutputStream. import java.io.*; public class KopirovaniProudu { public static void main(string[] argv) throws IOException { if(argv.length!= 2) return; File soubor1 = new File(argv[0]); File soubor2 = new File(argv[1]); if(!soubor1.isfile()) return; if(soubor2.exists()) soubor2.delete(); FileInputStream zdroj = new FileInputStream(soubor1); FileOutputStream cil = new FileOutputStream(soubor2); for(int n = 0; n < soubor1.length(); n++) cil.write(zdroj.read()); zdroj.close(); cil.close(); STANDARDNÍ VSTUP A VÝSTUP Standardní vstup a výstup je definován v třídě java.lang.system. V této třídě je definován i standardní chybový výstup. Standardní vstup je označen identifikátorem in a je to instance třídy InputStream. Oba výstupy jsou instancemi třídy PrintStream, která je odvozena od třídy

FilterOutputStream. Standardní výstup je označen identifikátorem out, chybový výstup pak identifikátorem err. Třída PrintStream nabízí statické metody: print( parametr ) println( parametr ) kde parametr může být prázdný nebo některý z primitivních datových typů boolean, char, double, float, int, long a samozřejmě String. System.out.print("Pěkný den!"); System.out.println(1011); System.out.println(); // odřádkuje Čtení z klávesnice je poněkud komplikovanější, jelikož abstraktní třída InputStream nabízí jen metodu read() pro načtení jednoho bytu ze vstupu. Načtení řetězce o max. délce 30 znaků z klávesnice může vypadat takto: byte pole[] = new byte[30]; // (1) System.in.read(pole); // (2) String text = new String(pole); // (3) System.out.println("Byl zadan: " + text); // (4) Na řádce (1) je deklarováno bytové pole, do kterého je následně načten vstup metodou read (2). Maximální délka vstupu je omezena hodnotou pole.length. Vstup se ukončí klávesou ENTER. Pokud je vstup delší je automaticky oříznut. Jelikož však vstup z klávesnice umožňuje vstup znaků v ASCII kódu je nutné provést převod na Unicode. Na řádce (3) je k tomuto účelu použít konstruktor třídy String, který převede bytové pole na řetězec. Z tohoto je zřejmé, že tento převod lze použít pro znaky 0-127 ASCII tabulky (viz příloha C.). Poslední řádka (4) pak načtený výsledek zobrazí.