Vstupy a výstupy v Javě.

Obsah

Vstupy a výstupy v Javě
Koncepce vstupně/výstupních operací v Javě
Práce se soubory
Třída Filesearch in Czech Wikipedia
Třída Filesearch in Czech Wikipedia (2)
Třída Filesearch in Czech Wikipedia (3)
Práce s adresáři
Práce s binárními proudy
Vstupní binární proudy
Důležité neabstraktní třídy odvozené od InputStreamsearch in Czech Wikipedia
Další vstupní proudy
Práce se znakovými proudy
Výstupní proudy
Konverze: znakové <-> binární proudy
Serializace objektů
Odkazy

Vstupy a výstupy v Javě

  • Koncepce I/O proudů v Javě, skládání (obalování vlastnostmi)

  • Práce se soubory a adresáři, třída File

  • Binární proudy, abstraktní třídy InputStream, OutputStream

  • Znakové proudy, abstraktní třídy Reader, Writer

  • Serializace objektů

Koncepce vstupně/výstupních operací v Javě

založeny na v/v proudech

plně platformově nezávislé

V/V proudy jsou

koncipovány jako "stavebnice" - lze vkládat do sebe a tím přidávat vlastnosti, např.

is = new InputStream(...); 
bis = new BufferedInputStream(is);    

Téměř vše ze vstupních/výstupních tříd a rozhraní je v balíku java.io.

počínaje Java 1.4 se rozvíjí alternativní balík - java.nio search in Czech Wikipedia (New I/O), zde se ale budeme věnovat klasickým I/O z balíku java.iosearch in Czech Wikipedia.

Blíže viz dokumentace API balíků java.io, java.nio.

Práce se soubory

vše je opět v balíku java.iosearch in Czech Wikipedia

základem je třída java.io.File search in Czech Wikipedia - nositel jména souboru, jakási "brána" k fyzickým souborům na disku.

používá se jak pro soubory, tak adresáře, linky i soubory identifikované UNC jmény (\\počítač\adresář...)

opět plně platformově nezávislé

na odstínění odlišností jednotlivých systémů souborů lze použít vlastností (uvádíme jejich hodnoty pro JVM pod systémem MS Windows):

Třída Filesearch in Czech Wikipedia

Vytvoření konstruktorem - máme několik možností:

new File(String filename)

vytvoří v aktuálním adresáři soubor s názvem filename

new File(File baseDir, String filename)

vytvoří v adresáři baseDir soubor s názvem filename

new File(String baseDirName, String filename)

vytvoří v adresáři se jménem baseDirName soubor s názvem filename

new File(URL url)

vytvoří soubor se (souborovým - file:) URL url

Testy existence a povahy souboru:

boolean exists()

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 ke čtení/zápisu:

boolean canRead()

test, zda lze soubor číst

boolean canWrite()

test, zda lze do souboru zapisovat

Třída Filesearch in Czech Wikipedia (2)

Vytvoření souboru nebo adresáře:

boolean createNewFile()

(pro soubor) vrací truesearch in Czech Wikipedia, když se podaří soubor vytvořit

boolean mkdir()

(pro adresář) vrací truesearch in Czech Wikipedia, když se podaří adresář vytvořit

boolean mkdirs()

navíc si dotvoří i příp. neexistující adresáře na cestě

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 (např. c:\tempsearch in Czech Wikipedia) s uvedeným prefixem a sufixem názvu

static File createTempFile(String prefix, String suffix, File directory)

dtto, ale vytvoří dočasný soubor v adr. directorysearch in Czech Wikipedia

Zrušení:

boolean delete()

zrušení souboru nebo adresáře

Přejmenování (ne přesun mezi adresáři!):

boolean renameTo(File dest)

přejmenuje soubor nebo adresář

Třída Filesearch in Czech Wikipedia (3)

Další vlastnosti:

long length()

délka (velikost) souboru v bajtech

long lastModified()

čas poslední modifikace v ms od začátku éry - podobně jako systémový čas vracený System.currentTimeMillis().

String getName()

jen jméno souboru (tj. poslední část cesty)

String getPath()

celá cesta k souboru i se jménem

String getAbsolutePath()

absolutní cesta k souboru i se jménem

String getParent()

adresář, v němž je soubor nebo adresář obsažen

Blíže viz dokumentace API třídy File.

Práce s adresáři

Klíčem je opět třída Filesearch in Czech Wikipedia - použitelná i pro adresáře

Jak např. získat (filtrovaný) seznam souborů v adresáři?

pomocí metody File[] listFiles(FileFilter ff)search in Czech Wikipedia nebo podobné

File[] listFiles(FilenameFilter fnf):

FileFilter je rozhraní s jedinou metodou boolean accept(File pathname), obdobně FilenameFilter, viz Popis API java.io.FilenameFilter

Práce s binárními proudy

Vstupní jsou odvozeny od abstraktní třídy InputStreamsearch in Czech Wikipedia

Výstupní jsou odvozeny od abstraktní třídy OutputStreamsearch in Czech Wikipedia

Vstupní binární proudy

Uvedené metody, kromě abstract byte read(), nemusejí být nutně v neabstraktní podtřídě překryty.

void close()

uzavře proud a uvolní příslušné zdroje (systémové "file handles" apod.)

void mark(int readlimit)

poznačí si aktuální pozici (později se lze vrátit zpět pomocí reset())...

boolean markSupported()

...ale jen když platí tohle

abstract int read()

přečte bajt (0-255 pokud OK; jinak -1, když už není možné přečí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ů

Důležité neabstraktní třídy odvozené od InputStreamsearch in Czech Wikipedia

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.

Příklady filtrů (ne všechny jsou v java.iosearch in Czech Wikipedia!):

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ů, např. float readFloat()search in Czech Wikipedia

java.security.DigestInputStream

počítá současně i haš (digest) čtených dat, použitý algoritmus lze nastavit

java.util.zip.InflaterInputStream

dekomprimuje (např. GZIPem) zabalený vstupní proud (má ještě specializované podtřídy)

LineNumberInputStream

doplňuje informaci o tom, ze kterého řádku vstupu čteme (zavrhovaná - deprecated - třída)

ProgressMonitorInputStream

přidává schopnost informovat o průběhu čtení z proudu

PushbackInputStream

do proudu lze data vracet zpět

Další vstupní proudy

Příklad rekonstrukce objektů ze souborů

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();    
javax.sound.sampled.AudioInputStream

vstupní proud zvukových dat

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

ObjectInputStream

proud na čtení serializovaných objektů

Práce se znakovými proudy

základem je abstraktní třída Readersearch in Czech Wikipedia, konkrétními implementacemi jsou:

Výstupní proudy

nebudeme důkladně probírat všechny typy

principy:

Příklady:

PrintStream

poskytuje metody pro pohodlný zápis hodnot primitivních typů a řetězců - příkladem jsou System.outsearch in Czech Wikipedia a System.errsearch in Czech Wikipedia

PrintWriter

poskytuje metody pro pohodlný zápis hodnot primitivních typů a řetězců

Konverze: znakové <-> binární proudy

Ze vstupního binárního proudu InputStreamsearch in Czech Wikipedia (čili každého) je možné vytvořit znakový Readersearch in Czech Wikipedia pomocí

// nejprve  binární vstupní proud - toho kódování znaků nezajímá 
InputStream is = ...

// znakový proud isr 
// použije pro dekódování standardní znakovou sadu
Reader isr = new InputStreamReader(is); 

// sady jsou definovány v balíku 
java.niosearch in Czech Wikipedia
 
Charset chrs = java.nio.Charset.forName("ISO-8859-2"); 

// znakový proud isr2 
// použije pro dekódování jinou znakovou sadu 
Reader isr2 = new InputStreamReader(is, chrs); 

Podporované názvy znakových sad naleznete na webu IANA Charsets.

Obdobně pro výstupní proudy - lze vytvořit Writer z OutputStream.

Serializace objektů

Odkazy

Tutoriály k Java I/O: kapitola z Sun Java Tutorial

Demo programy na serializaci (z učebnice): Serializace objektů