Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

17.2 Tiedostojen käsittely Javan tietovirroilla

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:

tiedosto\Tied_ka.java - Lukujen lukeminen tiedostosta

	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));
	
	  }
	}

Tehtävä 17.1 Tiedoston lukujen summa

1.
Muuta tiedoston Tied_ka.java - ohjelmaa siten, että väärän rivin kohdalla tulostetaan väärä rivi ja lopetetaan koko ohjelma.
2.
Muuta edelleen ohjelmaa siten, että väärät rivit tulostetaan näyttöön:
	Tiedostossa oli seuraavat laittomat rivit:
	kissa
	Lukuja oli... 
Ilmoitusta ei tietenkään tule, mikäli tiedostossa ei ole laittomia merkkejä. Tyhjää riviä ei tulkita vääräksi riviksi.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys