Første |
|
|
Java Stream IO serie, Planche nr. 16 |
 |
Udskrift af : Java Stream IO
|
Planche 1 : Java Stream IO
Stream IO handler om
- Datastrømme
- Filtre
- Byte-strømme
- Tegn-strømme
- Objekt-strømme
Planche 2 : En datastrøm?
En datastrøm er en forbindelse mellem en kilde og en aftager, hvorigennem
der flyder data.
En datastrøm flyder fra kilde til modtager.
Planche 3 : Filtre
Flere datastrømme kan kobles sammen ved hjælp af filter-objekter.
Et filter er en klasse, der konverterer en datastrøm med et format til
en datastrøm med et andet format.
Filtre svarer til pipes i UNIX og DOS
Planche 4 : Grundklasser
To grundlæggende, abstrakte klasser er defineret:
Disse to klasser - og deres myriader af afledte - er importeret fra
java.io.*;
To andre, grundlæggende og abstrakte klasser er
De findes i samme bibliotek - og har masser af afledte.
Planche 5 : Forskelle
- InputStream og OutputStream flyder bytes
- Reader og Writer flyder tegn (characters)
- FORSKEL?
- bytes er 8 bits dataelementer
- chars er UNICODE-tegn (16 bit)
Planche 6 : IO-undtagelse
- Alle strømme kan skabe undtagelser
- Undtagelsesklassen er IOException, udvidet fra Exception
- Husk at beskytte (
try
) strøm-metoder
- og fange (
catch
) undtagelserne.
Planche 7 : Vigtige Input-metoder
- read()
- læser bytes/chars fra strømmen - blocking
- (venter på, at der kommer data)
Eksempel:
if (s.read(bbuffer) != bbuf.length) ;
Læser tegn fra strømmen s ind i byte array bbuffer. Metoden returner
antallet af bytes, der er overført, og sammenligner det med max-længden
af bufferen. Hvis strømmen er nået til EOF, returneres -1 ved alle
efterfølgende kald. Det er en forældet (C/C++ lignende metode).
Planche 8 : Andre input-metoder
- skip () hopper over et antal bytes/tegn
- available () og ready() tester på, om der er tegn.
- mark () sætter et mærke i inputstrømmen
- reset () "spoler" tilbage til et mærke
- close () lukker strømmen (rydder op)
Planche 9 : Almindelige klasser
- ByteArrayInputStream og CharArrayReader
- FileInputStream og FileReader
- FilterInputStream og FilterReader (abstrakt)
- BufferedInputStream og BufferedReader
Eksempel
InputStream s = new BufferedInputStream(new FileInputStream("Filnavn.txt"));
Reader s = new BufferedReader(new FileReader("Filnavn.txt"));
Bemærk, at sidstnævnte metode automatisk konverterer fra bytes
(ISO8859/1) til char (Unicode).
Planche 10 : Avancerede klasser
Definerer (via interface DataInput) en række direkte metoder
f.eks.
- byte readByte()
- int readInt()
osv.
Der er en for hver primitiv datatype
DataInputStream opretter undtagelsen EOFException.
ObjectInputStream....
- Serialisation (Serialization)
Planche 11 : Vigtige output-metoder
- write()
- skriver (blocking) bytes/tegn til output-strømmen
- analog til read()
- flush()
- "tømmer" outputstrømmen (vigtig, hvis man skriver til konsol)
Planche 12 : Vigtige klasser
Analog til input:
- ByteArrayOutputStream og CharArrayWriter
- FileOutputStream og FileWriter
- FilterOutputStream og FilterWriter (abstrakt)
- BufferedOutPutStream og BufferedWriter
- Også et DataOutput interface.
Planche 13 : Fil IO - Opgave
class FilKopi {
public static void main (String[] args) {
DataInput aDI = new DataInputStream(new FileInputStream ("kilde"));
DataOutput aDO = new DataOutputStream(new FileOutputStream ("dest"));
String line ;
while ((line = aDI.readLine()) != null) {
StringBuffer modifiedLine = new StringBuffer (line);
// ...
// Her kunne indsættes kode, som gør noget ved modifiedLine
//
aDO.writeBytes(modifiedLine.toString());
}
aDI.close() ;
aDO.close() ;
}
}
Prøve at gøre denne kode færdig herunder ret fejl og fjern warnings
(undtagen deprecated), fang exceptions og behandl dem pænt. Omskrivning
er nødvendig.
Planche 14 : Specialklasser
PrintStream og PrintReader!
- System.out.print()
- System.out.println()
eller
- System.err.print()
- System.err.println()
og
Standard IO er klassevariable (ikke objekter): System.out, System.err
og System.in
Planche 15 : Pipe IO - Opgave
Omskriv den forrige opgave, så den kan fungere som et filterprogram i
Unix eller DOS, og at det interne format kan håndteres som String-typer.
Hints:
- 1) Udskift streams og readerklasser med nogle bedre velegnede.
- 2) Current input er pre-defineret
- 3) Current output er pre-defineret
Hvorfor kan 2 og 3 ikke bruges direkte?
Planche 16 : Java IO
© 2000 BLA*net - Leif E. Andersen,
leander@blanet.dk
Første |
|
|
Java Stream IO serie, Planche nr. 16 |