Domů » Informatika » Programovací jazyk » Jazyk Java » Vstupně-výstupní proudy


Vstupně-výstupní proudy

Třídy reprezentující vstupní a výstupní proudy ve standardní knihovně jazyka Java jsou velmi užitečné, protože umožňují přirozenou a snadnou práci s nejrůznějšími datovými proudy. Navíc jsou dostatečně univerzální a bylo nad nimi postaveno mnoho zajímavých knihoven.

Datové proudy lze chápat jako teoreticky nekonečné posloupnosti jednotlivých dat, které jsou poskytovány na vyžádání (on-demand). Podle směru, jakým se na datový proud nahlíží, se jedná o proud vstupní (teče směrem z vnějšího světa sem, slouží k načítání vnějších dat) nebo výstupní (teče odsud do vnějšího světa, slouží k odesílání či zápisu dat).

Stejný proud je ze strany vysílače vnímán jako proud výstupní a ze strany přijímače jako proud vstupní. Proud je tedy vždy o komunikaci dvou stran.

Korektní zavírání proudů

Zavírat se musí vždy jen „nejvyšší“ proud, tedy ten, který byl vytvořen jako poslední. V něm vnořené proudy budou uzavřeny automaticky. Výstupní proudy při uzavření provedou automatickou synchronizaci, není tedy třeba před uzavřením proudu explicitně volat metodu flush().

V následujícím příkladu způsobí uzavření „vyššího“ proudu BufferedInput­Stream uzavření „nižšího“ vnořeného proudu FileInputStream.

kód v jazyce Java - Zobrazit

  1. InputStream is = null;
  2.  
  3. try {
  4.   is = new BufferedInputStream(new FileInputStream(file));
  5.   // ...
  6.   // (práce s proudem)
  7.   // ...
  8. } finally {
  9.   if (is != null) {
  10.     is.close();
  11.   }
  12. }

Proudové kopírování souborů

Následující metoda ukazuje jak se realizuje proudové kopírování souborů (nebo obecně dvou libovolných proudů, pokud se FileInputStream a FileOutputStream nahradí jinými proudy).

kód v jazyce Java - Zobrazit

  1. InputStream is = null;
  2. OutputStream os = null;
  3.  
  4. try {
  5.   is = new BufferedInputStream(new FileInputStream(srcFile));
  6.   os = new BufferedOutputStream(new FileOutputStream(destFile));
  7.  
  8.   while (true) {
  9.     // načíst znak ze vstupu
  10.     int data = is.read();
  11.     // ověřit konec
  12.     if (data != -1) {
  13.       // konec toku
  14.       break;
  15.     }
  16.     // zapsat znak na výstup
  17.     os.write(data);
  18.   }
  19. } finally {
  20.   if (os != null) {
  21.     os.close();
  22.   }
  23.   if (is != null) {
  24.     is.close();
  25.   }
  26. }

Komprese ZIP

Ve standardní knihovně jazyka Java se vyskytuje i třída pro zápis komprimovaných dat metodou ZIP.

kód v jazyce Java - Zobrazit

  1. ZipOutputStream zos = null;
  2.  
  3. try {
  4.   // otevřít proud
  5.   zos = new ZipOutputStream(new FileOutputStream(file));
  6.  
  7.   // vložit záznam (textový soubor)
  8.   zos.putNextEntry(new ZipEntry("file.txt"));
  9.   zos.write("example".getBytes("UTF-8"));
  10.   zos.closeEntry();
  11.  
  12.   // vložit záznam (obrázek)
  13.   zos.putNextEntry(new ZipEntry("image.png"));
  14.   ImageIO.write(image, "png", zos);
  15.   zos.closeEntry();
  16.  
  17.   // uzavřít archiv
  18.   zos.finish();
  19. } finally {
  20.   if (zos != null) {
  21.     // uzavřít proud
  22.     zos.close();
  23.   }
  24. }

Načtení souboru do byte[]

Uvedená metoda načte soubor do pole typu byte[].

kód v jazyce Java - Zobrazit

  1. private static byte[] readFileToBytes(File file) throws FileNotFoundException, IOException {
  2.   InputStream is = null;
  3.   ByteArrayOutputStream os = null;
  4.  
  5.   try {
  6.     is = new BufferedInputStream(new FileInputStream(file));
  7.     os = new ByteArrayOutputStream();
  8.  
  9.     while (true) {
  10.       int data = is.read();
  11.  
  12.       if (data == -1) {
  13.         break;
  14.       }
  15.  
  16.       os.write(data);
  17.     }
  18.  
  19.     return os.toByteArray();
  20.   } finally {
  21.     if (os != null) {
  22.       os.close();
  23.     }
  24.     if (is != null) {
  25.       is.close();
  26.     }
  27.   }
  28. }

Stažení obsahu URL do souboru

Uvedená metoda stáhne obsah umístěný na vzdálené adrese a zapíše jej do požadovaného souboru. Zápis probíhá proudově.

kód v jazyce Java - Zobrazit

  1. private static void download(String href, File target) throws IOException {
  2.   URL url = new URL(href);
  3.   InputStream is = null;
  4.   OutputStream os = null;
  5.  
  6.   try {
  7.     is = new BufferedInputStream(url.openStream(), 4096);
  8.     os = new BufferedOutputStream(new FileOutputStream(target), 4096);
  9.  
  10.     while (true) {
  11.      int i = is.read();
  12.  
  13.       if (i == -1) {
  14.         break;
  15.       }
  16.  
  17.       os.write(i);
  18.     }
  19.   } finally {
  20.     if (os != null) {
  21.       os.close();
  22.     }
  23.     if (is != null) {
  24.       is.close();
  25.     }
  26.   }
  27. }

Reference