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 DataOutputStream. String 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 readDouble, readInt, readUTF. 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ů