// máme libovolný InputStream is is = new InputStream(...); // bis přidá k proudu is vlastnost vyrovnávací paměti bis = new BufferedInputStream(is);
typ dat |
vstupní |
výstupní |
znakové |
|
|
binární |
|
|
// máme libovolný InputStream is is = new InputStream(...); // bis přidá k proudu is vlastnost vyrovnávací paměti bis = new BufferedInputStream(is);
odvozeny od abstraktní třídy InputStream, např. FileInputStream.
odvozeny od abstraktní třídy OutputStream, např. FileOutputStream.
public class CopyFile { public static void main(String args[]) throws IOException { FileReader in = null; FileWriter out = null; try { in = new FileReader("input.txt"); out = new FileWriter("output.txt"); int c; // ve skutečnosti je v c opravdu bajt (nebo -1) while ((c = in.read()) != -1) { out.write(c); } } finally { // nutné pro korektní zavření za všech okolností if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
uzavře proud a uvolní příslušné zdroje (systémové "file handles" apod.)
poznačí si aktuální pozici
(později se lze vrátit zpět pomocí reset())
ale jen když platí tohle
přečte bajt (0-255 pokud OK; jinak -1, když už není možné přečíst)
přečte pole bajtů
přečte pole bajtů se specifikací délky
a pozice plnění pole b
vrátí se ke značce nastavené metodou mark(int)
přeskočí zadaný počet bajtů
je bázová třída k odvozování všech vstupních proudů přidávajících vlastnost/schopnost filtrovat poskytnutý vstupní proud.
Příklady filtrů (ne všechny jsou v java.io):
proud s vyrovnávací pamětí (je možno specifikovat její optimální velikost)
proud s kontrolním součtem (např. CRC32)
proud dešifrující data ze vstupu
má metody pro čtení hodnot primitivních typů,
např. float readFloat()
počítá současně i haš (digest) čtených dat, použitý algoritmus lze nastavit
dekomprimuje (např. GZIPem) zabalený vstupní proud (má ještě specializované podtřídy)
doplňuje informaci o tom, ze kterého řádku vstupu čteme (zavrhovaná — deprecated — třída)
přidává schopnost informovat o průběhu čtení z proudu
do proudu lze data vracet zpět
Příklad rekonstrukce objektů ze souborů:
FileInputStream istream = new FileInputStream("t.tmp"); ObjectInputStream p = new ObjectInputStream(istream); int i = p.readInt(); String s = (String)p.readObject(); Date d = (Date)p.readObject(); istream.close();
vstupní proud zvukových dat
proud dat čtených z pole bajtů
roura napojená na "protilehlý" PipedOutputStream
proud vzniklý spojením více podřízených proudů do jednoho virtuálního
proud na čtení serializovaných objektů
Reader.
BufferedReader
CharArrayReader
InputStreamReader
PipedReader
StringReader
LineNumberReader
FileReader
PushbackReader
FileReader → FileWriter).
read mají write(…).
PrintStream:
System.out (a chybového System.err).
PrintWriter
InputStream (čili každého)
je možné vytvořit znakový Reader pomocí
// nejprve binární vstupní proud, ten kódování znaků nezajímá InputStream is = ... // znakový proud isr // použije pro dekódování standardní znakovou sadu Reader isr = new InputStreamReader(is); // sady jsou definovány v balíku java.nio Charset chrs = java.nio.Charset.forName("ISO-8859-2"); // znakový proud isr2 // použije pro dekódování jinou znakovou sadu Reader isr2 = new InputStreamReader(is, chrs);
Writer z OutputStream.
finally:
String readFirstLineFromFileWithFinallyBlock(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { if (br != null) br.close(); } }
try-with-resourcesfinally, close atd.
try-with-resources:
String readFirstLineFromFile(String path) throws IOException { // toto je "try with resources", automaticky proud zavře try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
try-with-resources lze ošetřit i více proudů současně — zavřou se pak všechny.
try ( java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName); java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset))
try-with-resources dát nejen proud, ale
cokoli, co implementuje java.io.Closeable.
PrintStream a PrintWriter
je typ proudu standardního i chybového výstupu System.out.
checkError().
pro znaková data
Příklad s nastavením kódování:
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
postup, jak z objektu vytvořit sekvenci bajtů perzistentně uložitelnou na paměťové médium (disk) a později restaurovatelnou do podoby výchozího javového objektu.
je právě zpětná rekonstrukce objektu
java.io.Serializable.
transient.
private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException
private void writeObject(java.io.ObjectOutputStream stream) throws IOException
Tutoriál essential Java I/O: kapitola z Oracle Java Tutorial