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...