Javan IO-systeemi on varsin monimutkainen. Erilaisia tietovirtoja on yli 60 kappaletta. Alimman tason virta-luokat ovat abstrakteja luokkia määräten vain virtojen rajapinnan. Ylemmällä tasolla hoidetaan fyysistä lukemista ja kirjoittamista. Fyysinen lukeminen ja kirjoittaminen voi tarkoittaa levyn käyttöä, verkon käyttöä tai muiden IO-porttien käyttöä. Seuraavaksi ylemmällä tasolla tarjotaan yksinkertaisempaa rajapintaa esimerkiksi rivien käsittelyyn. Siksi virtoja käytettäessä niitä pitää kerrostaa.
Kun perustoimet on saatu tehtyä, on tiedostojen käsittely Javassa esimerkiksi System.in ja System.out - tietovirtoja vastaavien tietovirtojen käsittelyä.
Olkoon meillä tiedosto nimeltä luvut.dat:
13.4 23.6 kissa 1.9 <EOF> <- ei aina välttämättä mikään merkki
Kirjoitetaan esimerkkitiedoston luvut lukeva ohjelma Javan tietovirroilla. Tarkoitus on hylätä ne rivit, joilla ei ole pelkästään reaalilukua:
import java.io.*;
import fi.jyu.mit.ohj2.Mjonot;
/**
* Lukujen lukeminen tiedostosta
* @author Vesa Lappalainen
* @version 1.0, 07.03.2003
*/
public class Tied_ka {
public static void main(String[] args) {
BufferedReader fi;
try { // Avataan tiedosto lukemista varten
fi = new BufferedReader(new FileReader("luvut.dat"));
} catch (FileNotFoundException ex) {
System.out.println("Tiedosto ei aukea!");
return;
}
double summa=0;
int n=0;
try {
String s; double luku;
while ( ( s = fi.readLine() ) != null ) {
try {
luku = Double.parseDouble(s);
} catch (NumberFormatException ex) {
continue;
}
summa += luku;
n++;
}
} catch (IOException ex) {
System.out.println("Virhe tiedostoa luettaessa!");
} finally { // Aina ehdottomasti finally:ssa resurssien vapautus
try {
fi.close(); // tiedoston sulkeminen heti kun sitä ei enää tarvita
} catch (IOException ex) {
System.out.println("Tiedostoa ei saa suljettua!");
}
}
double ka = 0;
if ( n > 0 ) ka = summa/n;
System.out.println("Lukuja oli " + n + " kappaletta.");
System.out.println("Niiden summa oli " + Mjonot.fmt(summa,4,2));
System.out.println("ja keskiarvo oli " + Mjonot.fmt(ka,4,2));
}
}
Tiedostossa oli seuraavat laittomat rivit: kissa Lukuja oli...