Dione
Z. KotalaP. Toman: Java
Predchozi (Obsah) Dalsi

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

Pozn.: Zßkladnφ datovΘ typy je vhodnΘ nejd°φve naΦφst jako °et∞zec a pak provΘst konverzi.

Pozn.: 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.).


Predchozi
Converted by Selathco v0.9 on 25.09.1999 19:46
Dalsi