Tietojen syöttäminen ohjelmalle Tähän mennessä on käsitelty Javan tulostuslauseet System.out.print ja System.out.println sekä ohjelman perusrakenneosat (muuttujat, vakiot, lauseet). Jotta päästään tekemään todellisia vuorovaikutteisia ohjelmia, on tutustuttava siihen, kuinka ohjelma saadaan ottamaan vastaan käyttäjän syötteitä. Seuraavaksi esitetään kaksi eri tapaa syötteiden vastaanottamiseksi. Näistä kaksi ensimmäistä ovat JDK 5.0:n omia syötteiden lukumekanismeja (Scanner ja BufferedReader) ja kolmas graafiseen dialogiin pohjautuva tapa. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla JDK 5.0:ssa on tietojen lukemista varten olemassa Scanner-luokka. Tästä on kuitenkin muistettava se, että Scanner-luokasta pitää aina muistaa luoda ilmentymä: Scanner syote = new Scanner(System.in); Seuraavassa esimerkissä on toteutettu ohjelma, joka laskee yhteen kaksi käyttäjän syöttämään kokonaislukua. Luvut kysytään järjestyksessä käyttäjältä. Ohjelma laskee niiden summan ja tulostaa tämän jälkeen tuloksen näytölle. Esimerkissä on käytetty kokonaisluvun lukemiseen nextint()-metodia. Scannerluokan metodeja ovat esimerkiksi: int nextint(); double nextdouble(); String next(); String nextline(); // kokonaisluvun lukeminen // liukuluvun lukeminen // merkkijonon lukeminen // kokonaisen rivin lukeminen
Yksittäisen merkin lukemiseksi ei ole omaa metodia. Merkki voidaan lukea merkkijonona. Kutakin näistä metodeista käytetään kuten edellä esimerkissä esitetty nextint()-metodia eli: muuttuja = lukija.next (); Edellä olevissa metodien esittelyissä vastaanottavan muuttujan tyyppi (int, double, String) näkyy metodien nimen edessä (ns. metodin paluuarvon tyyppi). Scanner-luokan käyttämiseksi ohjelman alkuun pitää kirjoittaa import-lause: import java.util.scanner; Kun Scanneria ei enää tarvita, sen voi sulkea close()-metodilla. Tietojen syöttäminen ohjelmalle BufferedReader-luokan avulla JDK 5.0:ssa on tietojen lukemista varten olemassa myös BufferedReader-luokka. Kuten Scannerluokastakin, myös BufferedReader-luokasta pitää aina ensin muistaa luoda ilmentymä: BufferedReader syote = new BufferedReader(new InputStreamReader(System.in)); Seuraavassa esimerkissä on toteutettu ohjelma, joka pyytää käyttäjältä syötteenä merkkijonon ja tulostaa tämän jälkeen käyttäjän syöttämän merkkijonon. Esimerkissä on käytetty merkkijonon lukemiseen readline()-metodia. Tätä metodia käytetään kutsumalla lukijaa metodin kutsun yhteydessä: muuttuja = lukija.readline(); BufferedReader-luokan käyttämiseksi ohjelman alkuun pitää kirjoittaa import-lause: import java.io.*; Käytettäessä BufferedReader-luokkaa on ohjelmassa tutkittava syötevirrasta mahdolliset poikkeukset. Tästä syystä ohjelman runkoon main-metodin yhteyteen on lisättävä poikkeusten tarkistamista varten throws IOException -teksti.
BufferedReaderin avulla voidaan merkkijonojen sijasta lukea myös yksittäisiä merkkejä, kokonaislukuja tai liukulukuja. Koska readline()-metodi kuitenkin lukee koko annetun rivin merkkijonona, on merkkien ja lukujen kohdalla tehtävä tietotyypin vaihdos. Yksittäinen merkki voidaa lukea char.at(0)-metodilla. Tässä luku nolla (0) viittaa indeksin arvoon, eli merkin paikkanumeroon. Tarvittaessa tässä metodissa luku nolla (0) voidaan korvata muulla indeksin arvolla, esimerkiksi charat(2) lukee annetun merkkijonon kolmannen merkin. Lukujen kohdalla merkkitieto voidaan muuttaa halutuksi tietotyypiksi pakotetun tietotyypin muutoksen avulla. Tarpeen mukaan käytetään parseint- tai parsedouble-metodia. Muutkin tietotyypin muutokset ovat mahdollisia, mutta nämä riittävät aluksi. (vrt. graafisten syöttö- ja tulostoimintojen kohdalla tapahtuvia tyyppimuunnoksia) Integer.parseInt merkkijonon muuttaminen int-tyypin kokonaisluvuksi Double.parseDouble merkkijonon muuttaminen double-tyypin liukuluvuksi. Jos merkkijonon muuttaminen ei onnistu siitä syystä, että merkkijonossa on kirjaimia tai jotain muuta vikaa, ohjelma kaatuu virheeseen.
Yksinkertaiset graafiset syöttö- ja tulostustoiminnot Edellä on käsitelty tietojen syöttäminen ja tulostaminen merkkipohjaisesti. Syöttöön käytetään omia syöttörutiineja ja tulostukseen omia System.out.print- ja System.out.println-metodeja. Ohjelmista saadaan helposti graafisia käyttämällä Javan Swing-kirjastoon kuuluvan JoptionPaneluokan syöttö- ja tulostusikkunoita, joita kutsutaan dialogeiksi. Tulostusdialogi Tietojen tulostaminen voidaan tehdä showmessagedialog-metodilla, jota kutsutaan seuraavasti: JoptionPane.showMessageDialog(null, Tulostettava teksti ); Sulkeiden sisään kirjoitetaan tulostettavan tekstin lisäksi esimerkeissämme aina ensiksi null ja pilkku. Tässä null ilmaisee, että sovelluksessa ei ole pääikkunaa. Yksinkertainen ohjelma, joka tulostaa dialogin. Ohjelma tulostaa ikkunan: Graafista ohjelmaa kirjoitettaessa on muistettava seuraavat kaksi seikkaa: 1. Ohjelmatiedoston alkuun ennen luokan nimeä kirjoitetaan import javax.swing.*; jolla sisällytetään ohjelmaan graafinen Swing-kirjasto. 2. Pääohjelma viimeiseksi riviksi kirjoitetaan Syöttödialogi System.exit(0); joka pitää aina kirjoittaa graafisen ohjelman loppuun. Lause vapauttaa ohjelman varaamat resurssit ja lopettaa ohjelman. Tietojen syöttäminen tehdään showinputdialog-metodilla, johon liittyy tiedon kysyminen ja käyttäjän syötteen vastaanottaminen. Metodia kutsutaan seuraavalla tavalla:
String lukustr; int luku; lukustr = JOptionPane.showInputDialog( Anna kokonaisluku : ); luku = Integer.parseInt(lukuStr); Tiedot otetaan vastaan aina String-muuttujan sijoituslauseessa kuten edellä. Merkkitieto pitää muuttaa halutuksi tyypiksi parse-metodeilla. (vrt. tietojen lukeminen BufferedReaderilla) Näitä metodeja on erityyppisille muunnoksille. Alkuun riittävät: Integer.parseInt merkkijonon muuttaminen int-tyypin kokonaisluvuksi Double.parseDouble merkkijonon muuttaminen double-tyypin liukuluvuksi. Jos merkkijonon muuttaminen ei onnistu siitä syystä, että merkkijonossa on kirjaimia tai jotain muuta vikaa, ohjelma kaatuu virheeseen. Huomaa, että graafisia syöttödialogeja käytettäessä ei tarvita erillisiä tulostus- ja syöttölauseita, kuten merkkipohjaista syöttöä ja tulostusta käytettäessä. Seuraava ohjelma pyytää käyttäjältä kokonaislukua ja tulostaa sen. Ohjelman tulostamat dialogit ovat seuraavat: Laajojen ohjelmaprojektien kohdalla nämä syötteiden lukukeinot ovat varsin työläitä ja pitkiä. Tehokkaampaa työskentelyä ja yksinkertaisempaa ohjelmakoodia varten kannattaa syötevirran lukemista varten kirjoittaa oma luokkansa, johon sisällytetään käytettävät lukumetodit. Tämä luokka voidaan toteuttaa esimerkiksi nimellä lue.class. Käyttöä varten tämä luokka pitää kopioida samaan hakemistoon, jossa sitä käyttävät ohjelmat ovat. Ohjelmakoodi yksinkertaistuu tällöin huomattavasti, koska joka kerta ei tarvitse luoda erikseen omaa lukijaa. Tämä mekansimi jätetään kuitenkin tässä kohtaa käsittelemättä.