Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

8.3.1 Lukeminen merkkijonoon

Javan IO-systeemi on varsin monimutkainen. Sitä ei olekaan suunniteltu aloittelevaa käyttäjää silmällä pitäen, vaan mahdollisimman laajennettavaksi. Sellaiseksi että samoilla luokilla voitaisiin hoitaa tiedon lukeminen tiedostosta ja verkosta.

	    // Syöttöpyyntö ja vastauksen lukeminen
	    System.out.print("Anna matka millimetreinä>");
	    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	    String s = "";
	    try {
	      s = in.readLine();
	    } catch (IOException ex) {
	    }

Alkuun tarvitsemme olion, joka pystyy lukemaan kokonaisen rivin ja tunnistaa meidän puolestamme rivin lopun. Tämä saadaan aikaiseksi yhdistämällä System-luokan olio in lukijaan ( InputStreamReader) ja yhdistämällä se puskuroituun lukijaan ( BufferedReader):

	    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

Sama voitaisiin tehdä useammallakin lauseella:

	    InputStreamReader instream = new InputStreamReader(System.in);
	    BufferedReader in = new BufferedReader(instream);

Tässä tapauksessa emme kuitenkaan tarvitse itse käyttää apuluokkaa instream, joten tyydymme yhden rivin versioon.

Satu uusi olio in pystyy lukemaan päätteeltä tietoa. Esimerkiksi metodi readLine lukee kokonaisen rivin. Eli käyttäjä syöttää merkkejä päätteelle ja painaa Enter. Jos tulee jokin ongelma syöttövirran kanssa olio heittää poikkeuksen IOException. Tässä tapauksessa emme välitä poikkeuksista muuta kuin, että se on otettava vastaan ( catch).

Nyt lohkon

	    String s = "";
	    try {
	      s = in.readLine();
	    } catch (IOException ex) {
	    }

jälkeen merkkijono-oliossa s on joko päätteeltä luettu arvo tai mikäli jokin meni vikaan, niin tyhjä merkkijono. Vielä on mahdollista että syöttövirta katkaistiin kesken kaiken. Windows-konsolilla tämä tapahtuu jos painetaan Ctrl-Z ja Unix/Linux-konsolilla Ctrl-C. Tällöin olioviite s ei viittaa mihinkään (sen arvo on null).

Siksipä tutkimmekin seuraavaksi mistä on kyse ja lopetamme ohjelman ilman sen suurempia mukinoita:

	    if ( s == null ) return;
	    if ( s.equals("") ) return;

Tuon voi kirjoittaa myös yhdelle riville, koska Javan ||-operaattori (tai) suorittaa totuusarvoista lauseketta vain siihen saakka kunnes totuusarvo selviää:

	    if ( ( s == null ) || ( s.equals("") ) ) return;

Huomattakoon että myös muoto

	    if ( ( s == null ) | ( s.equals("") ) ) return;

on syntaktisesti oikein, mutta tarkoittaa hieman eri asiaa. Looginen lopputulos molemmissa on ehdon lausekkeelle sama. Mutta | -operaattorilla molemmat lausekkeet suoritetaan aina. Ja tässä tapauksessa tämä olisi virhe jos s olisi null.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys