InputStream. FilterInputStream



Podobné dokumenty
Práce se soubory v Javě

6. PRÁCE S DATOVÝMI PROUDY

Vstupy a výstupy strana 125

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

Soubor jako posloupnost bytů

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

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

Textové soubory. alg9 1

Úvod do programovacích jazyků (Java)

7. Dynamické datové struktury

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

Regulární výrazy. Vzory

Seminář Java VI p.1/33

KTE / ZPE Informační technologie

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

Algoritmizace a programování

VISUAL BASIC. Práce se soubory

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

Ošetřování chyb v programech

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

14. Vstupy a výstupy v Javě

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

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

Proudy, Zpracovсnэ XML. Radek Koэ

JAVA. Vstup a výstup

Generické programování

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

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

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

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

Programování v Javě I. Leden 2008

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

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

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

Výjimky. v C# a Javě

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

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

Typický prvek kolekce pro české řazení

20. Projekt Domácí mediotéka

Remote Method Invocation RMI

KTE / ZPE Informační technologie

Výčtový typ strana 67

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

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

Seminář Java II p.1/43

PREPROCESOR POKRAČOVÁNÍ

Programovací jazyk Java

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

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

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

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

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

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

7. Datové typy v Javě

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

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

Abstraktní třída a rozhraní

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

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

RMI Remote Method Invocation

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

Jazyk C# (seminář 5)

Teoretické minimum z PJV

C# - I/O, streamy, práce se soubory

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

17. Projekt Trojúhelníky

Ú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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Vstup/Výstup, Sokety. Duben 2012

7. Statické prvky třídy

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

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

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

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/

OOPR_05. Případové studie

Abstraktní datové typy: zásobník

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

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

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

Java a národní prostředí

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Principy objektově orientovaného programování

JAVA. Vstup a výstup

typová konverze typová inference

Dědičnost (inheritance)

Java aplety. Předávání parametrů z HTML

11. Dědičnost. Dědičnost strana 103

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

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

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

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

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

zapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text;

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

JAVA. Vstup a výstup

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

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

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

Transkript:

6. Vstupy a výstupy Pro práci se vstupy a výstupy nám Java poskytuje celou řadu tříd a jejich metod. Jsou uloženy v balíku java.io. Tato knihovna je založena na mechanizmu tzv. vstupních a výstupních proudů (streamů). Java poskytuje v podstatě čtyři základní třídy pro tvorbu proudů. Odlišuje vstupní a výstupní proudy a čtení po bytech nebo znacích. Pro vstupní bytově orientovaný proud je základní abstraktní třídou InputStream a pro bytově orientovaný výstup OutputStream. Pro znakové vstupy pak třída Reader a znakové výstupy třída Writer. Od každé z těchto tříd existuje několik potomků pro čtení/zápis z různých typů vstupních zařízení (soubory, roury,...). Každá z abstraktních tříd (InputStream, OutputStream, Reader a Writer) má specifického potomka abstraktní třídu, která je předkem filtrů tj. tříd, které přidávají další funkce pro jednotlivé potomky příslušné třídy. Mimo třídy pro proudy jsou v balíku java.io také třídy File (pro práci se soubory a adresáři), třída StreamTokenizer (pro rozdělení vstupního proudu na části), třídy definující různé výjimky a některé další. Vstupní proudy Pro vstupy tedy slouží proudy založené na třídě InputStream nebo Reader. Na obrázku vidíme třídu InputStream a její potomky. Struktura dědičnosti je u třídy Reader obdobná. InputStream SequenceInputStream FileInputStream FilterInputStream PipedInputStream StringBufferInputStream ByteArrayInputStream DataInputStream BufferedInputStream LineNumberInputStream PushbackInputStream obrázek 3 Hierarchie dědičnosti třídy InputStream Třídy pro vstup lze rozdělit do čtyř samostatných skupin: třídy pro vytvoření vstupního proudu, třídy poskytující další vlastnosti vstupnímu proudu, třídy pro vytvoření readeru a třídy pro rozšíření funkcí readeru. V následujících tabulkách je uveden jejich přehled. 38

Třída ImputStream FileInputStream PipedInputStream SequenceInputStream ByteArrayInputStream StringBufferInputStream tabulka 8 Třídy pro vstup po bytech Třída FilterInputStream BufferedInputStream DataInputStream LineNumberInputStream PushbackInputStream tabulka 9 Třídy přidávající funkčnost pro čtení po bytech použití abstraktní třída, která definuje základní metody pro čtení po bytech čtení ze souboru, parametrem konstruktoru je String se jménem souboru nebo object typu File čtení z roury (z objektu, do kterého zapisuje PipedOutputStream) vytvoří jeden vstupní proud ze dvou vstupních proudů, které jsou parametrem konstruktoru čtení z pole bytů v paměti, které je parametrem konstruktoru převede String na InputStream, doporučuje se používat místo toho StringReader použití předek tříd, které čtou z jiného InputStreamu a přidávají k tomu další funkčnost vytváří buffer pro čtení, čímž je toto čtení efektivnější ve spolupráci s třídou DataOutputStream umožňuje přenášet údaje ve formátu přenositelném mezi různými platformami přidává metodu pro číslování čtených řádků, doporučuje se použít LineNumberReader umožňuje vrátit část přečtených bytů zpět do vstupního proudu Pro čtení po znacích byla vytvořena třída Reader a její potomci. Měly by se používat vždy, kdy se čte text, neboť v této třídě je garantována správná obsluha znakových sad a převod textu do vnitřního kódování Javy (do znakové sady Unicode). V následující tabulce je přehled tříd pro vytvoření readeru a jejich srovnání s potomky třídy InputStream: Třída použití odpovídající InputStream Reader abstraktní třída, která definuje základní metody InputStream pro čtení po znacích InputStreamReader převádí InputStream na Reader - FileReader čtení ze souboru, parametrem konstruktoru je FileInputStream String se jménem souboru nebo object typu File PipedReader čtení z roury (z objektu, do kterého zapisuje PipedInputStream PipedWriter) CharArrayReader čtení z pole znaků v paměti, které je ByteArrayInputStream parametrem konstruktoru StringReader převede String na Reader StringBufferInputStream tabulka 10 Třídy pro čtení po znacích a jejich obdoba pro čtení po bytech 39

Třída použití odpovídající InputStream FilterReader předek tříd, které čtou z jiného Readeru a FilterInputStream přidávají k tomu další funkčnost BufferedReader vytváří buffer pro čtení, současně přidává BufferedInputStream metodu ReadLine() pro čtení po řádcích, LineNumberReader přidává metodu pro číslování čtených řádků LineNumberInputStream PushbackReader umožňuje vrátit část přečtených znaků zpět do vstupního streamu PushBackInputStream tabulka 11 Třídy pro rozšíření funkčnosti readeru Ke třídám SequenceInputStream a DataInputStream neexistují odpovídající readery. Čtení ze souboru Nejčastěji používaným vstupem je textový soubor. Pokud chceme přečíst tento soubor po řádcích, je nutné si pro to vytvořit vhodný vstupní proud. Pro čtení po znacích se souboru A.TXT si můžeme připravit instanci třídy FileReader takto: FileReader ctiznak = new FileReader ("a.txt"); a poté lze číst jednotlivé znaky z tohoto souboru pomocí metody read ( ) int znak = ctiznak.read ( ); Většinou však chceme číst po řádcích a pro takovéto čtení musíme instanci třídy FileReader ještě "zabalit" do filtru BufferedReader, který nám to umožní: BufferedReader radek = new BufferedReader (ctiznak); a pak použít metodu readline ( ) String s = radek.readline(); Obě tyto třídy poskytují také metodu close() pro zavření souboru. Pro testování konce souboru používáme při čtení po bytech hodnotu 1 nebo hodnotu null při čtení po znacích. Následující kód ukazuje jak přečíst a na konzoli vypsat textový soubor a.txt. public class Cteni { public static void main (String [] args){ BufferedReader vstup = new BufferedReader (new FileReader ("a.txt")); String s; while ((s = vstup.readline())!= null) System.out.println (s); vstup.close(); catch (IOException e){ System.out.println ("Chyba na vstupu souboru a.txt"); 40

Jak již bylo řečeno v předchozí kapitole, některé výjimky je nutno ošetřit. K těmto výjimkám patří IOException a proto je její odchycení (případně poslání výše) nutné. Bez ošetření výjimky IOException není tento program přeložitelný. Čtení z konzole Pro čtení z konzole lze použít System.in.read(byte b). Jak sami vidíte, pro standardní vstup je použita instance in třídy InputStream, tudíž je možno číst pouze po bytech. Tento standardní vstup, stejně jako výstup, otevírá JVM vždy při spuštění programu. Pro přečtení řádky z konzole je tedy nutné tento stream "zabalit" do filtrů. Nejprve je vhodné převést vstup ze čtení po bytech na čtení po znacích pomocí instance třídy InputStreamReader takto: InputStreamReader ctiznak = new InputStreamReader(System.in); Pro čtení po řádcích pak tento vstup zabalíme ještě do BufferedReaderu jako při čtení ze souboru. Standardní vstup se zavírá automaticky při skončení programu, není tedy nutné použít metodu close(). Stejně jako při čtení ze souboru musíme ošetřit výjimky IOException. Následující příklad přečte jednu řádku z konzole: public class Cteni2 { public static void main (String [] args) { System.out.print("Zadej text: "); BufferedReader cti =new BufferedReader (new InputStreamReader(System.in)); String s = cti.readline(); System.out.println (s); catch (IOException e) { System.out.println("chyba vstupu"); 41

Výstupní proudy OutputStream FileOutputStream FilterOutputStream ByteArrayOutputStream PipedOutputStream PrintStream DataOutputStream BufferedOutputStream obrázek 4 Struktura dědíčnosti třídy OutputStream Obdobně jako u vstupu lze třídy pro výstup rozdělit do čtyř skupin: třídy pro vytvoření výstupního proudu, třídy pro rozšíření funkčnosti výstupního proudu, třídy pro vytvoření Writeru a třídy pro rozšíření funkčnosti Writeru. Třída použití OutputStream abstraktní třída, která definuje základní metody pro zápis po bytech FileOutputStream zápis do souboru, parametrem konstruktoru je String se jménem souboru nebo object typu File PipedOutputStream zápis do roury (do objektu, ze kterého čte PipedInputStream) ByteArrayOutputStream zápis do pole bytů v paměti, které je parametrem konstruktoru tabulka 12 Třídy pro zápis po bytech Třída použití FilterOutputStream předek tříd, které přidávají k OutputStreamu další funkčnost BufferedOutputStream vytváří buffer pro efektivnější zápis DataOutputStream ve spolupráci s třídou DataInputStream umožňuje přenášet údaje ve formátu přenositelném mezi různými platformami PrintStream formátuje výstup, poskytuje metody print a println tabulka 13 Třídy pro přídání funkčnosti pří zápisu po bytech 42

Třída použití odpovídající OutputStream Writer abstraktní třída, která definuje základní metody OutputStream pro zápis po znacích OutputStreamWriter převádí OutputStream na Writer - FileWriter zápis do souboru, parametrem konstruktoru je FileOutputStream String se jménem souboru nebo object typu File PipedWriter zápis do roury (do objektu, ze kterého čte PipedOutputStream PipedReader) StringWriter zápis do bufferu, který může být převeden do - objektu String či StringBuffer CharArrayWriter zápis do pole znaků v paměti ByteArrayOutputStream tabulka 14 Třídy pro zápis po znacích Třída použití odpovídající OutputStream FilterWrite předek tříd, které přidávají k OutputStreamu FilterOutputStream další funkčnost BufferedWriter vytváří buffer pro efektivnější zápis BufferedOutputStream PrintWriter formátuje výstup, poskytuje metody print a println PrintStream tabulka 15 Třídy pro rozšíření funkčnosti při zápisu po znacích Třída DataOutputStream nemá odpovídající Writer. Zápis do textového souboru Pro zápis do textového souboru použijeme zápis po znacích. Nejdříve musíme soubor pro zápis otevřít, tj. vytvořit výstupní writer. Pokud soubor na disku neexistuje, bude vytvořen nový, pokud existuje, bude přepsán. Jestliže chceme do již existujícího souboru připisovat na konec, musíme použít konstruktor třídy FileWriter se dvěma parametry. První parametr je soubor, do kterého budeme zapisovat. Druhý je logická hodnota, která určuje, zda budeme zapisovat za konec souboru nebo původní soubor přepisovat. Hodnota true znamená dopisování na konec souboru. Pro zápis po znacích do souboru A.TXT si můžeme připravit instanci třídy FileWriter takto: FileWriter pisznak = new FileWriter ("a.txt"); Takto připravený výstup nám umožní zápis po znacích. Výhodnější je však zapisovat po řádcích, proto musíme ještě použít filtr PrintWriter, který má metodu println() pro zápis celého řádku. PrintWriter vystup = new PrintWriter (pisznak); Po skončení zápisu nesmíme zapomenout na metodu close() pro zavření souboru. Jako u každé práce s vstupy a výstupy je nutné ošetřit výjimky. Následující příklad ukazuje zapsání deseti řádek do textového souboru na disk po řádcích (metodou println()). 43

public class Soub { public static void main(string [] args) { PrintWriter vystup = new PrintWriter (new FileWriter("a.txt")); for (int i=1; i<11 ; i++) vystup.println("radek "+i); vystup.close(); catch (IOException e) { System.out.println("Chyba pri zapisu"); Výstup na konzoli (System.out) nemusíme nijak "zabalit" protože autoři Javy použili ve třídě System pro proměnnou out typ PrintOutputStream, tj. třídu která umí zapisovat celé řádky. Třída StringTokenizer V balíku java.util lze najít třídu StringTokenizer, které je určena pro rozdělování textových řetězců na jednotlivé části. Pokud máme např. textový soubor s adresami, kdy na každém řádku jsou údaje o jedné osobě, potřebujeme při načítání souboru oddělit jednotlivé části jako je jméno, příjmení atd. Právě k tomuto účelu slouží třída StringTokenizer a její metody. V konstruktoru určíme/ řetězec, který se má rozdělit na tzv. tokeny. Je možno zadat i rozdělovací znak. Pokud použijete konstruktor bez určení rozdělovacího znaku, jsou standardně použity znaky "\t\n\r", což je tabulátor, mezera a nový řádek. Třída StringTokenizer poskytuje metodu hasmoretokens() pro určení, zda ještě následuje další část řetězce (vrací hodnotu true nebo false) a metodu nexttoken(), která vrací hodnotu tokenu jako String. V následujícím příkladě je ukázáno použití této třídy pro rozdělení řádky textového souboru na části. Soubor Zvirata.txt má následující obsah: pes Rek kocka Micka kocka Mourek pes Alik morce Smudla morce Fousek kocka Packa pes Bety pes Asta kocka Paty pes Fik V následujícím programu vypíšeme pouze jména zvířat a bez označení druhu. 44

import java.util.*; public class Tokenizace { public static void main(string [] args) { BufferedReader vstup = new BufferedReader (new FileReader("zvirata.txt")); String s,s1,s2 = " "; while ((s = vstup.readline())!= null) { StringTokenizer t = new StringTokenizer(s); s1 = t.nexttoken(); s2 = t.nexttoken(); System.out.println(s2); vstup.close(); catch (IOException e) { System.out.println("Chyba pri cteni/zapisu"); Výstup programu je následující: Rek Micka Mourek Alik Smudla Fousek Packa Bety Asta Paty Fik Další třídy a metody pro práci s proudy Práce se vstupními a výstupními proudy není pouze v balíku java.io, ale i v několika dalších. Existují další metody a třídy pro vytváření vstupních proudů (např. pro čtení ze sítě, pro čtení BLOB z databází) i další třídy pro přidání funkčnosti k proudům (např. komprimace či šifrování). Čtení ze sítě Nejdříve si zde uvedeme, jak číst soubor ze sítě. Základem je třída URL, v rámci které se zadává adresa souboru, ke kterému chceme přistupovat. Nejjednodušší je zadat textovou adresu jako parametr konstruktoru: URL mojeurl = new URL("http://www.vse.cz/"); Pokud zadáme špatný parametr, vyvolá konstruktor výjimku MalformedURLException. Instance třídy URL může vytvořit vstupní proud následujícím způsobem: 45

InputStream is = mojeurl.openstream(); S takto vytvořeným proudem můžeme pracovat jako s kterýmkoliv jiným proudem. Následující příklad vypíše soubor na URL http://www.vse.cz/ na standardní výstup (porovnejte ho s prvním příkladem v kapitole o vstupních souborech): import java.net.*; public class CteniURL { public static void main (String [] args){ URL mojeurl = new URL("http://www.vse.cz/ ); InputStream is = mojeurl.openstream(); BufferedReader vstup = new BufferedReader (new InputStreamReader (is)); String s; while ((s = vstup.readline())!= null) System.out.println (s); vstup.close(); catch (MalformedURLException e) { System.out.println ("Chybne URL"); catch (IOException e){ System.out.println ("Chyba na vstupu"); Komprimace a dekomprimace souborů Třídy a metody pro komprimaci a dekomprimaci souborů typu ZIP a GZIP jsou v balíku java.util.zip. Následující příklad zkomprimuje vstupní soubor, jehož jméno je zadáno jako parametr na příkazové řádce do výstupního zkomprimovaného souboru test.gz. import java.util.zip.*; public class GZIPCompress { public static void main (String [] args){ BufferedReader vstup = new BufferedReader ( new FileReader(args[0])); BufferedOutputStream vystup = new BufferedOutputStream ( new GZIPOutputStream ( new FileOutputStream("test.gz"))); int c; while ((c = vstup.read())!= -1) vystup.write(c); vstup.close(); vystup.close(); catch (IOException e){ 46

System.out.println ("Chyba na vstupu/vystupu"); e.printstacktrace(); Třída File Třída File slouží pro manipulaci se soubory a adresáři. Instancí třídy File může být adresář nebo soubor. Při vytváření instance není nutné, aby soubor (případně adresář) fyzicky existoval na disku. Pro oddělování adresářů a souborů v popisu cesty používáme lomítko / nebo dvě zpětná lomítka (\\ - ve Windows). Lze použít i proměnnou File.separator. Vytvoření instance třídy File je možno pomocí tří různých konstruktorů - File (String jmeno); - File (String cesta, String jmeno); - File (File adresar, String jmeno); příklad použití File mujsoubor = new File ("a.txt") File mojedopisy = new File("C:"+File.separator+ "dopisy") File mujdopis = new File ("C:/dopisy/dopis1.txt") File mujdopis = new File ("C:\\dopisy","dopis1.txt") File dopis = new File (mojedopisy,"dopis1.txt") tabulka 16 Použití konstruktorů třídy File význam instance mujsoubor nastavena na soubor a.txt v aktuálním adresáři instance mojedopisy nastavena na adresář dopisy na disku C instance mujdopis nastavena na soubor dopis1.txt v adresáři dopisy na disku C instance mujdopis nastavena na soubor dopis1.txt v adresáři dopisy na disku C instance mujdopis nastavena na soubor dopis1.txt v adresáři dopisy na disku C, použili jsme instanci mojedopisy vytvořenou dříve Třída File obsahuje metody isfile() a isdirectory(), které zjistí, zda daná instance třídy File je soubor či adresář (musí již fyzicky existovat na disku). Pokud chceme existenci souboru nebo adresáře ověřit použijeme metodu exists(). Všechny tyto tři metody vracejí hodnotu typu boolean. Pro vytvoření adresáře slouží metoda mkdir(), pro vytvoření souboru metoda createnewfile() Zjistit velikost existujícího souboru nebo adresářemůžeme pomocí metody length().soubor nebo adresář je možno smazat metodou delete() nebo přejmenovat pomoci metody renameto(). Pro výpis adresáře slouží metoda list(), která vrací pole řetězců se jmény souborů a adresářů. Následující program vypíše obsah adresáře dokumenty na disku C. public class VypisAdresare { public static void main (String [] args) { File adresar = new File ("C:/dokumenty"); String [] obsah = adresar.list(); for (int i = 0;i < obsah.length;i++) System.out.println(obsah[i]); 47

Nyní program upravíme tak, aby vypsal pouze adresáře obsažené v adresáři dokumenty. public class VypisAdresare2 { public static void main (String [] args) { File adresar = new File ("C:/dokumenty"); String [] obsah = adresar.list(); for (int i = 0;i < obsah.length;i++){ File prvek = new File (adresar,obsah[i]); if (prvek.isdirectory()) System.out.println(obsah[i]); Pokud chceme použít pro výpis masku (tj. vypsat pouze některé soubory či adresáře na základě nějaké podmínky) použijeme jako parametr metody list instanci třídy, která má implementováno rozhraní FilenameFilter. Toto rozhraní má pouze jednu metodu boolean accept ( File dir, String name ), kde dir je adresář, který obsahuje testovaný soubor a name je jméno tohoto souboru. Metoda vrací logickou hodnotu zda soubor vyhovuje výběrovému kritériu. 48