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
BufferedInputStream uzavření „nižšího“ vnořeného proudu
FileInputStream.
kód v jazyce Java - Zobrazit
-
InputStream is = null;
-
-
try {
-
is = new BufferedInputStream(new FileInputStream(file));
-
// ...
-
// (práce s proudem)
-
// ...
-
} finally {
-
if (is != null) {
-
is.close();
-
}
-
}
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
-
InputStream is = null;
-
OutputStream os = null;
-
-
try {
-
is = new BufferedInputStream(new FileInputStream(srcFile));
-
os = new BufferedOutputStream(new FileOutputStream(destFile));
-
-
while (true) {
-
// načíst znak ze
vstupu
-
int data = is.read();
-
// ověřit konec
-
if (data != -1) {
-
// konec
toku
-
break;
-
}
-
// zapsat znak na
výstup
-
os.write(data);
-
}
-
} finally {
-
if (os != null) {
-
os.close();
-
}
-
if (is != null) {
-
is.close();
-
}
-
}
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
-
ZipOutputStream zos = null;
-
-
try {
-
// otevřít proud
-
zos = new ZipOutputStream(new FileOutputStream(file));
-
-
// vložit záznam (textový
soubor)
-
zos.putNextEntry(new ZipEntry("file.txt"));
-
zos.write("example".getBytes("UTF-8"));
-
zos.closeEntry();
-
-
// vložit záznam
(obrázek)
-
zos.putNextEntry(new ZipEntry("image.png"));
-
ImageIO.write(image, "png", zos);
-
zos.closeEntry();
-
-
// uzavřít archiv
-
zos.finish();
-
} finally {
-
if (zos != null) {
-
// uzavřít proud
-
zos.close();
-
}
-
}
Načtení souboru do byte[]
Uvedená metoda načte soubor do pole typu byte[].
kód v jazyce Java - Zobrazit
-
private static byte[] readFileToBytes(File file) throws FileNotFoundException, IOException
{
-
InputStream is = null;
-
ByteArrayOutputStream os =
null;
-
-
try {
-
is = new BufferedInputStream(new FileInputStream(file));
-
os = new ByteArrayOutputStream();
-
-
while (true) {
-
int data =
is.read();
-
-
if (data == -1) {
-
break;
-
}
-
-
os.write(data);
-
}
-
-
return os.toByteArray();
-
} finally {
-
if (os != null) {
-
os.close();
-
}
-
if (is != null) {
-
is.close();
-
}
-
}
-
}
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
-
private static void download(String href, File target) throws IOException {
-
URL url = new URL(href);
-
InputStream is = null;
-
OutputStream os = null;
-
-
try {
-
is = new BufferedInputStream(url.openStream(), 4096);
-
os = new BufferedOutputStream(new FileOutputStream(target), 4096);
-
-
while (true) {
-
int i = is.read();
-
-
if (i == -1) {
-
break;
-
}
-
-
os.write(i);
-
}
-
} finally {
-
if (os != null) {
-
os.close();
-
}
-
if (is != null) {
-
is.close();
-
}
-
}
-
}
Reference