15. 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. V nßsledujφcφch podkapitolßch m∙╛ete najφt struΦn² popis hlavnφch t°φd
s n∞kter²mi jejich metodami.
15.1. 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.
Priklad 15.1. |
File soubor = new File("soubor.txt");
System.out.println("DΘlka souboru: " + soubor.length);
|
|
15.2. 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 a to:
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 (viz p°φloha C.),
- public final String readUTF() - naΦte °et∞zec v UTF k≤dovßnφ (viz C.1.),
- 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,
Priklad 15.2. |
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();
}
}
|
|
15.3. 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 (viz kap. 16.).
15.4. 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 .
15.5. 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 .
15.6. 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 .
Priklad 15.3. |
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();
}
}
|
|
15.7. 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 n∞kter² z primitivnφch datov²ch
typ∙ boolean, char, double, float, int,
long a samoz°ejm∞ String.
Priklad 15.4. |
System.out.print("Rozbijte wokna!");
System.out.println(1011);
|
|
╚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.
Priklad 15.5. |
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("Zadal jsi: " + 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φ.
|
|
Zßkladnφ datovΘ typy je vhodnΘ nejd°φve naΦφst jako °et∞zec a pak provΘst
konverzi.
Jeliko╛ Java je orientovßna na grafickß rozhranφ, je v²hodn∞j╣φ pou╛φvat pro
vstup a v²stup knihovnu AWT (viz p°φloha A.).
|