Princip datových proudů

Datové proudy (dále jen proudy) jsou sekvence dat. Proud je definován svým vstupem a výstupem, těmi mohou být například soubor na disku, zařízení (vstupní klávesnice nebo myš, výstupní displej) nebo jiný program.

Vstupně–výstupní zařízení (I/O):

  • znakové: vstupní – klávesnice, výstupní – monitor, tiskárna.
  • bloková: pevný disk, flash disk, SD, microSD. . .

Z klávesnice čteme sekvenčně znak po znaku (sekvenční přístup), u binárního diskového souboru můžeme libovolně přistupovat ke zvolené části dat – náhodný přístup.

Primitivní proudy pouze přenášejí binární data, specializované proudy umí s přenášenými daty manipulovat. Tyto manipulační schopnosti se liší podle typu přenášených dat.

Typy přenášených informací:

  • binární data – obrázky, zvuk, objekty, ... - data uložené ve stejné formě v jaké jsou uloženy v počítači
  • textová data – představují řádky textů v ASCII (abc) nebo UNICODE (ޢމޖޝ  ॠआड़) 

Typy proudů

Znakové proudy

- posloupnost 16-bitových znaků UNICODE

- rozhraní: java.io.Reader, java.io.Writer

Příklad kopírování  obsahu ze vstupního souboru do výstupního. 

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ZkopírujZnaky {
    public static void main(String[] args) throws IOException {

        FileReader in = null;
        FileWriter out = null;

        try {
            in = new FileReader("vstup.txt"); //otevři vstupní proud
            out = new FileWriter("výstup.txt"); //otevři výstupní proud

            int c;    //právě čtený znak (16 bitů), -1 znamená konec souboru
            while ((c = in.read()) != -1) { //dokud jsou data na vstupu
                out.write(c);   //zapiš znak na výstup
            }
        } finally {
            if (in != null) { //pokud je otevřený vstupní proud
                in.close(); //uzavři ho
            }
            if (out != null) { //pokud je otevřený výstupní proud
                out.close(); //uzavři ho
            }
        }
    } 
}

 

Bajtové proudy

- proud čte nebo zapisuje data na nízké úrovni po 8 bitových svazcích.

- rozhraní:  java.io.InputStream, java.io.OutputStream

 

Proudy s vyrovnávací pamětí

čtení/zápis s využitím vyrovnávací paměti

- rozhraní:  BufferedReader/ BufferedWriter 

 

Datové proudy

Java obsahuje třídy pro pohodlné čtení a zápis primitivních datových typů a typu String. Nejrozšířenější třídy jsou DataInputStream a DataOutputStreamString je ukládán v kódování UTF-8. Údaje takto uložené např. do souboru nejsou uživatelsky přívětivé a s výjimkou řetězců čitelné. Metody pro čtení jsou readDoublereadIntreadUTF. Obdobně metody pro zápis mají předponu write.

 

Objektové proudy

Většina standardních tříd implementuje rozhraní Serializable (serializovatelný), které je nezbytné pro jejich podporu objektovými proudy. Objektové proudy rozšiřují datové proudy, takže objektové proudy umí pracovat i s primitivními datovými typy. Nové metody jsou readObject a writeObject. Pokud metoda readObject vrátí jiný než očekávaný objekt, vyhodí výjimku typu ClassNotFoundException. Pokud se objekt neskládá jen z primitivních typů ale i z referencí na další objekty, je potřeba zachovat tyto reference. Proto je při zápisu objektu uložit i všechny objekty, na které má daný objekt odkaz. Podobně se bude chovat čtecí proud, který se bude snažit zrekonstruovat celou takovou síť objektů

Kam dál?