Ohjelmointiprojekti I (2 ov) kevät 2003

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

1. Missä vietät joulun useimmiten?. 2. Missä viettäisit joulun mieluiten?
Minimaalinen Java-ohjelma •Kaikki ohjelmakoodi on luokkamäärityksen sisällä •Ohjelma käynnistyy ”public static void main(String[] args)”-metodista •System.out.print()
Esiopetuksen huoltajat 2014 Generated on :41.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
JavaScript (c) Irja & Reino Aarinen, 2007
© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 6 (osittain) Tiedostot.
Luku 5 – Tietojen hakeminen sovelluksiin
Julkaisukielet ja - tekniikat tMyn1 Julkaisukielet ja -tekniikat •Verkko-ohjelmointi voidaan jakaa kahteen osaan: asiakaspuolen ja palvelinpuolen ohjelmointiin.
Jukka Juslin Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11.
EXtensible Markup Language
Taulukot Jukka Juslin © Jukka Juslin 2006.
Ohjelmointitaito (ict1td002, 12 op) Syksy 2008
13. Pakkaukset.
Perusopetuksen huoltajat 2014 Generated on :04.
1 Ohjelmointiprojekti I (2 ov) kevät 2005 Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö.
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Yksinkertaiset graafiset syöttö- ja tulostustoiminnot.
Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja.
1 WWW-lomakkeet Sähköisen liiketoiminnan tärkeä elementti.
Perusopetuksen oppilaat 2014 Generated on :03.
© Jukka Harju, Jukka Juslin Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 9 Poikkeuskäsittely.
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
13. Hyvä ohjelmointitapa (osa 1)
© Jukka Harju, Jukka Juslin
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
1 Raha-asioiden suunnitteleminen ja nykyinen rahatilanne Senioritutkimus 2011.
ict1td002 - Copyright Raine Kauppinen 1 Alkuarvot ja tyyppimuunnokset (1/5)  Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int.
Visual Basic -ohjelmointi
String-vertailusta ja Scannerin käytöstä (1/2)
Kuinka tehdä blogi o365:ssä
Kuinka niitä käsitellään
1 DataOutputStream ja DataInputStream DataOutputStream:lla voidaan tallentaa perustietotyyppien arvoja binäärimuotoiseen tiedostoon DataInputStream:lla.
1 Tietovirrat ja niiden suunnat Tietovirralla on aina suunta Tiedostoon tallentaessa käytetään OutputStream-luokasta perittyjä luokkia Tiedostosta luettaessa.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Lomakkeet © Reiska, Lomakkeet Varsinkin Web-sovelluksia ajetaan täyttämällä sivulla lomake ja lähettämällä tiedot palvelimella olevan Web-sovelluksen.
Näppäimistöltä lukeminen Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In -luokka.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
Poikkeukset Yleistä Virheeseen varautuminen tarkoittaa sitä, että ohjelmoija huomioi koodia kirjoittaessaan ajonaikaisen virheen mahdollisuuden.
© Jukka Juslin1 Tiedostot Tuloksellinen Java-ohjelmointi.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen
Komponenttipohjainen ohjelmistotekniikka (TJTSS56) Osa 4 Kevätlukukausi 2010 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Markku Sakkinen.
Suomen Lääkäriliitto | Finnish Medical AssociationLääkärit Suomessa | Physicians in Finland Tilastotietoja lääkäreistä ja terveydenhuollosta 2014 Statistics.
1. Missä vietät joulun useimmiten?. 2. Missä viettäisit joulun mieluiten?
2. Lisää Java-ohjelmoinnin alkeita
Poikkeustenkäsittely- lohkot tMyn1 Poikkeustenkäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw.
Tiedostojen käsittely
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Graafinen käyttöliittymä, osa 1
Javan oliovirrat eli oliotiedostojen käsittely. Olio- eli objektitiedostojen käsittely Käsittely täysin samanlaista kuin muiden tiedostojen 1.Otetaan.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
14. Poikkeukset Sisällys Johdanto poikkeuksiin. Poikkeusten käsittely: − Poikkeusten käsittely paikallisesti. − Poikkeusten heittäminen. Exception.
MapInfon tiedostot TAB – Tiedosto, jonka avulla tietokanta avataan MapInfossa. Tiedostossa tietoja kentistä ja koordinaattijärjestelmästä. DAT, XLS. TXT.
Tiedostot. 8.2 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen.
5. Kapselointi.
6. Tiedostot.
Poikkeustenkäsittelylohkot try-catch
Kuinka niitä käsitellään
8. Näppäimistöltä lukeminen
7. Hyvä ohjelmointitapa..
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
8. Näppäimistöltä lukeminen
Kuinka niitä käsitellään
3. Attribuutit.
4. Luokan testaus ja käyttö olion kautta
eli oliotiedostojen käsittely
Esityksen transkriptio:

Ohjelmointiprojekti I (2 ov) kevät 2003 Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö

Kurssin sisältö Appletit toimintaympäristö, filosofia erot Java-ohjelmaan (application) rajapinnan metodit grafiikka www:n käyttö rajoitukset

Kurssin sisältö Tiedostojenkäsittely Poikkeustenkäsittely erilaiset tiedostot olioiden sarjallistaminen tiedostojen käsittelyyn tarvittavat luokat erilaisia apuluokkia tekstin käsittelyyn Poikkeustenkäsittely Poikkeusten käyttötarkoitus Poikkeusten toiminnan rakenne Omien poikkeusten määrittely

Kurssin sisältö Javadoc-dokumentointi Tapahtumankäsittely Javan dokumentoinnin rakenne Javadocin tagien muoto Javan dokumentoinnin käytännöt Tapahtumankäsittely Javan komponenttien rakenne Komponenttien kommunikointi Käyttöesimerkki

Appletit Appletit eivät ole itsenäisiä ohjelmia WWW-sivulla kerrotaan, että halutaan ladata appletti Selain käynnistää virtuaalikoneen, jonka sisällä appletti pyörii Appletti ei näe selaimen ulkopuolelle, se voi käyttää vain selaimen palveluja Selain tarkistaa appletin oikeellisuutta Appletti voi sisältää monta luokkaa

Kuva selaimen ja appletin suhteesta Selain Selaimen palvelut Virtuaalikone -Käynnistää virtuaali- koneen tarvittaessa -Kuuntelee virtuaali- koneen pyyntöjä -Toteuttaa ne, jos ne eivät riko turvalli- suusmääräyksiä ja ne on selaimessa määritelty Pyynnöt -Pyörittää applettia -Pyytää selaimelta palveluja -Saa selaimelta palvelujen tulokset -Ei voi viitata virtu- aalikoneen ”hiekka- laatikon” ulkopuolelle Vastaukset

Appletin käynnistäminen www-sivulta <applet code=”sovelma.class” CODEBASE=”http://www.appletti.fi/a/” WIDTH=250 Height=70> <PARAM name=”etu” value=”Paavo”> <PARAM name=”suku” value=”Väyrynen”> </applet>

Erot Java-sovelluksiin (application) Appletit eivät ole itsenäisiä ohjelmia, vaan ne vaativat selaimen toimiakseen Appleteista puuttuu Main-metodi Appletit on tarkoitettu ladattavaksi verkon yli, niissä pyritään keveyteen Appletit perivät Applet-luokan ”public class LuokanNimi extends Applet” Appleteissa ei ole konstruktoria Appletit toimivat aina graafisesti

Turvallisuusrajoitukset Tiedostoja ei voi lukea isäntäkoneelta Verkkoyhteyden voi ottaa vain samalle palvelimelle, josta appletti ladattiin Ei voi käynnistää ohjelmia isäntäkoneelta Ei voi tutkia isäntäkoneen ominaisuuksia Ei voi käynnistää natiivimetodeja Voi käyttää vain selaimen virtuaalikoneen palveluja, ei muiden osapuolten java-pakkauksia

Applet-luokasta periytyvät metodit init() start() stop() Appletin alustus, muuttujien alustus start() Selain kutsuu tätä metodia kun suoritus alkaa stop() Selain kutsuu tätä metodia, kun suoritus keskeytyy destroy() Varattujen resurssien tuhoaminen juuri ennen appletin suorituksen lopettamista

getParameter(String param) getDocumentBase() getCodeBase() Hakee HTML-sivun parametrin param arvon getDocumentBase() Palauttaa HTML-sivun hakemiston URL:n getCodeBase() Palauttaa URL:n hakemistoon, josta appletin tavukoodi on ladattu paint(Graphics g) Appletin piirtävä metodi

getAudioClip(URL url) play(URL url) getImage(URL url) Lataa kuvan osoitteesta url getAudioClip(URL url) Lataa äänitiedoston osoitteesta url play(URL url) Soittaa äänitiedoston osoitteesta url

import java.awt.Graphics; import java.applet.*; public class Appletti extends Applet{ public void paint (Graphics g) { g.drawString(getParameter("etu"),10,10); g.drawString(getParameter("suku"),10,20); }

import java.awt.Graphics; import java.applet.*; public class Initialisoitu extends Applet{ String teksti; public void init() { teksti="On käynnistetty."; } public void start() { teksti=teksti+" Ja taas."; public void paint (Graphics g) { g.drawString(teksti, 10,10);

Appletti on täysin graafinen olio Appletti ja grafiikka Appletti on täysin graafinen olio Kaikki tulokset täytyy näyttää graafisesti Appletviewer kykenee näyttämään System.out.println()-tulostuksia komentorivi-ikkunassa Jotta voisi käyttää appletteja, täytyy hallita ainakin alkeet grafiikan tekemisestä appleteilla

Grafiikan perusteet Appletilla Kaksi tapaa: AWT ja Swing AWT on vanhempi, mutta laajalti käytössä AWT on yksinkertaisempi AWT riittää hyvin appletteihin, jotka eivät ole valtavan monimutkaisia Swing käydään läpi APSK-kurssilla Luokka Applet kuuluu AWT:hen Swingiin liittyy luokka JApplet

Applet luokka toimii komponenttisäiliönä komponentit ovat käyttöliittymän elementtejä säiliöön voi lisätä ja poistaa komponentteja säiliöön voi asettaa layout-managereita komponentit on esitelty omissa luokissaan Appletti Komponentti 2 Kompo-nentti 1 Komponentti 3

AWT:ssa on monta erilaista komponenttia:

Component on yläluokka kaikille komponenteille. Button tavallinen painonappi, joka laukaisee toimenpiteen Canvas piirtopinta CheckBox valintaruutu Choice pudotusvalikko Label tekstilaatikko List vyörytyslista ScrollBar liu’utin

TextComponent luokka tekstin lukemiseen ja näyttämiseen TextComponent luokka tekstin lukemiseen ja näyttämiseen. Tämä jakaantuu kahteen: TextArea monirivinen tekstikenttä TextField yksirivinen tekstikenttä Container on komponenttisäiliö. Nämä eivät itse näy, mutta ne sisältävät lisää säiliöitä Panel perussäiliö. Näitä on usein monta yhdessä ruudussa. Niiden avulla voi vaikkapa ryhmitellä eri komponentteja yhdeksi ryhmäksi.

Applet sisältää yhteistoiminnallisuuden selainten kanssa Applet sisältää yhteistoiminnallisuuden selainten kanssa. Appletilla on piirtopinta, johon voidaan suoraan piirtää. Applettiin laitettavat muut komponentit tulevat tämän piirtopinnan päälle. ScrollPane kiinteän kokoinen alue, johon voi laittaa skrollit, kun sisältö ei enää mahdu piirtoalueelle. Window päätason säiliöluokka. Sisältää osanaan muut komponenttisäiliöt. Dialogit luovat valmiin sapluunan yksinkertaiseen kommunikointiin käyttäjän kanssa.

Frame Window:n alainen luokka, joka tulee koko ikkunan ja komponenttisäiliöiden väliin. Tässä on jo otsikko ja menut.

Toimintaperiaate Joko piirretään suoraan Appletin piirtopinnalle, jos appletti on yksinkertainen, tai Sijoitetaan komponentit applettiin, ja laitetaan komponentteihin halutut tiedot komponenteissa on metodit, joiden avulla niiden tilaa muutetaan tai tutkitaan

Appletin piirtopinnalle piirtäminen Ylikirjoitetaan paint-metodi Käytetään Graphics-luokan metodeita: drawImage(Image img, int x, int y, ImageObserver observer ) piirtää ladatun kuvan (Image) paikkaan (x,y) drawLine(int x1, int y1, int x2, int y2) piirtää viivan (x1,y1) -> (x2,y2) drawOval(int x,int y,int width,int height) Piirtää ovaalin paikkaan (x,y), leveys on width ja korkeus height

drawPolygon(int[] xPoints,int[] yPoints, int nPoints) piirtää polygonin drawPolyline(int[] xPoints, int[] yPoints,int nPoints) piirtää murtoviivan drawRect(int x,int y,int width,int height) piirtää suorakulmion drawString(String str,int x,int y) piirtää tekstiä annettuun paikkaan

getClipBounds() setColor(Color c) palauttaa viittauksen piirtoalueen kokoon. getClipBounds().width palauttaa piirtoalueen leveyden ja .height korkeuden setColor(Color c) Vaihtaa piirtovärin. Käyttö esim. setColor(Color.black) tai setColor(new Color(0,15,200))

Fontin käyttö: setFont(Font f) asettaa fontin. Esim. setFont(new Font("TimesRoman",Font.BOLD, 36)) luokka Font määrittelee fontin.

Skaalaus Usein tulee tilanne, että piirrettävää kuviota pitää skaalata siten, että se täyttää aina kulloisenkin piirtotilan Esim. viiva piirretään määrätyistä koordinaateista määrättyihin koordinaatteihin getClipBounds-metodilla saadaan piirtoalueen koko

Esim. Ajatellaan, että ruutu on 100*100 pikseliä Pitää piirtää suorakulmio, jonka vasen ylänurkka on pisteessä (10,10) ja oikea alanurkka pisteessä (90,90) Halutaan skaalata kuva eri kokoiseksi xLev=getClipBounds.width yKor=getClipBounds.height piirretään g.drawRect((int)0.1*xLev, (int)0.1*yKor, (int)0.9*xLev, (int)0.9*yKor);

Tiedostojen käsittely Perusyksikkö on tiedosto Tiedosto koostuu loogisesti yhteenkuuluvista tiedoista Tiedostot tallennetaan pysyvästi levylle Levyllä olevat tiedostot sijaitsevat hakemistohierarkiassa Hakemistot käsitetään Javassa myös tiedostoiksi Javassa tiedostoa kuvaa luokka File Appletti ei voi ladata tiedostoja levyltä

File(String pathname) File-luokka Konstruktorit: File(String pathname) Luo uuden File-olion, joka viittaa parametrina annettuun tiedostoon File f =new File(”tiedosto.txt”) Luo viittauksen tiedosto.txt-tiedostoon oletushakemistossa (suhteellinen osoitustapa)

File f=new File (”\\hakemisto\\tiedosto.txt”) Windows-tylinen absoluuttinen osoitus. Mainitaan tiedoston koko hakupolku. Tarvitaan kaksi ”\”-merkkiä, koska yksi tunnistettaisiin erikoismerkin edeltäjäksi. File f=new File (”/hakemisto/tiedosto.txt”) UNIX (Apple) –tyylinen osoitus Käytössä olevan hakemistoeroittimen saa selville File.separator Voi käyttää File f=new File (File.separator+”hakemisto”+ File.separator+”tiedosto”)

boolean getAbsolutePath() boolean isFile() boolean isDirectory() Muita metodeja boolean exists() palauttaa tosi, jos tiedosto on olemassa boolean getAbsolutePath() palauttaa absoluuttisen polun boolean isFile() palauttaa tosi, jos tiedosto on tiedosto boolean isDirectory() palauttaa tosi, jos tiedosto on hakemisto

Muita metodeja boolean delete() boolean mkdir() canRead() canWrite() palauttaa epätosi, jos ei onnistunut boolean mkdir() luo hakemiston, palauttaa onnistuiko canRead() voiko lukea? canWrite() voiko kirjoittaa createNewFile() luo uuden tiedoston

Java-ohjelmat eivät suoraan lue laitteilta Tiedostovirta Java-ohjelmat eivät suoraan lue laitteilta Luodaan virta (stream), joka yhdistää Java-ohjelman haluttuun tiedostoon jollain laitteella Java-ohjelma Levy Tiedostovirta

Tiedostovirtoja käsittelevät luokat voidaan jakaa neljään ryhmään: InputStream-ryhmän luokat lukevat tietoa tavuittain OutputStream-ryhmän luokat kirjoittavat tietoa tavuittain Reader-ryhmän luokat lukevat tietoa merkeittäin Writer-ryhmän luokat kirjoittavat tietoa merkeittäin

Tiedostoja on kahta päätyyppiä: tekstitiedosto sisältää tekstimuotoista tietoa, jota voi editorilla muokata. Esim. .java-tiedostot) binääritiedosto sisältää tietoa ei-tekstimuodossa, sen sisällön voi lukea vain jollain ohjelmalla, joka tätä tietoa tarvitsee. Esim. .class-tiedostot Ero on siis esitysmuodossa

Tekstitiedosto Tekstitiedostossa tiedot ovat riveittäin Rivillä on päätösmerkki (eol (end-of-line)) Tiedostoa luetaan rivi kerrallaan merkeittäin Binääritiedosto Sisältää tietoa, jota täytyy lukea tavuittain Voi olla vaikkapa kuvatiedosto, olioita

Tiedoston avaamisprosessi etenee seuraavasti: Määritellään tiedosto, jota käytetään Avataan siihen tiedostovirta Luetaan (tai kirjoitetaan) tiedostovirrasta sopivalla lukijalla Sopivan lukijan valinta riippuu luettavasta tai kirjoitettavasta tiedosta

Käsitellään seuraavaksi tekstitiedoston lukemista Tekstitiedoston tiedostovirta kuuluu Reader-ryhmään Ryhmän yläluokka on Reader, jonka alaluokkana on mm. BufferedReader

BufferedReader-luokka Konstruktori BufferedReader(Reader in) Konstruktori vaatii parametrinaan Reader-tyyppisen parametrin, joka edustaa tiedostovirtaa. Reader on itse abstakti luokka, joten se ei käy. Olio-ohjelmoinnin sääntöjen mukaan parametriksi käy myös Readerin perillinen. Sopiva luokka tähän on FileReader. Se luo merkkien lukemisvirran parametrinaan saamaansa File-olioon.

Muita metodeja String readLine() int read() void close() lukee yhden rivin tekstiä int read() lukee yhden merkin, jonka palauttaa ilman koodausta kokonaislukuna void close() sulkee tiedoston

void mark(long readAheadLimit) Muita metodeja void mark(long readAheadLimit) merkitsee kohdan virrassa. Parametri kertoo kuinka monta merkkiä enintään täytyy merkintä muistaa void reset() palaa edelliseen merkittyyn kohtaan virrassa void skip(long n) ohittaa seuraavat n merkkiä virrassa

BufferedWriteriä käytetään vastaavasti kirjoittamaan tiedostoon BufferedWriteriä käytetään vastaavasti kirjoittamaan tiedostoon. Sen tärkeimmät metodit ovat: void close() sulkee tiedoston void flush() kirjoittaa puskurin sisällön tiedostoon. Tällöin ei ole vaaraa, että tiedot jäävät kirjoittamatta vaikkapa ohjelman kaatumisen takia. void newLine() rivinvaihto

Muita metodeja void write(String st) tämä metodi oikeastaan peritään Writer-luokasta. Se kirjoittaa tekstin st tiedostoon ilman rivinvaihtoa. Rivinvaihdon voi kirjoittaa joko käyttämällä newLine-metodia tai kirjoittamalla write(st+”\n”)

Binääritiedoston kirjoittaminen ja lukeminen Periaatteet ovat samat, käytetään vain eri luokkia Nämä luokat kuuluvat InputStream ja OutputStream –ryhmiin Binääritiedostojen lukemisessa ja kirjoittamisessa eteen voi tulla kaksi tapausta: Halutaan lukea Java-olioita Halutaan lukea yleistä binääridataa

FileInputStream(File file) Luokan metodeja ovat: int read() Tapauksessa 2 voidaan käyttää FileInputStream ja FileOutputStream –luokkia FileInputStream luokka avaa tiedostovirran tiedostoon. Sen konstruktori on seuraava: FileInputStream(File file) parametrina annetaan tiedosto file Luokan metodeja ovat: int read() palauttaa yhden tavun tiedostovirrasta. Tavu palautetaan kokonaislukuna.

Muita metodeja int read(byte[] b) void skip(long n) void close() lukee b.length tavua taulukkoon b. Tavut ovat muodossa byte. void skip(long n) ohita n tavua virrassa void close() sulje lukuvirta

FileOutputStream(File file) avaa kirjoitusvirran tiedostoon file FileOutputStream(File file, boolean append) avaa kirjoitusvirran. Jos append on tosi, lisätään tavut tiedoston loppuun. Luokan metodeja: void write(int b) kirjoittaa tavun kirjoitusvirtaan

Muita metodeja void write(byte[] b) void close() void flush() kirjoittaa taulukon b kirjoitusvirtaan void close() sulkee tiedoston void flush() tyhjentää kirjoitusvirran tiedostoon. Tällöin vältetään tavujen menetys ohjelman kaatuessa.

Tapaus 1:ssä haluttiin tallentaa olioita. Jotta oliot voisi tallentaa, ne täytyy sarjallistaa

Sarjallistaminen Normaalisti oliot ovat muistissa jossain kohtaa, eivät välttämättä yhdessä kohtaa Tavukoodissa tallennetaan luokan koodi, ei erillisten olioiden sisältöjä Niiden attribuutit voisi tallentaa erikseen, mutta tällöin monimutkaisten olioiden tallentaminen olisi tavattoman työlästä Ratkaisu ongelmaan on sarjallistaminen (serialization): oliot koodataan tavupötköksi, joka sitten kirjoitetaan levylle

Sarjallistamiseen vaaditaan, että luokka toteuttaa Serializable-rajapinnan. Tämä rajapinta ei vaadi oliolta mitään, se vain kertoo kääntäjälle, että olio saatetaan sarjallistaa Kun olio sarjallistetaan, se muutetaan tavupötköksi, kun se luetaan tavupötkö muutetaan olioksi.

ObjectInputStreamin metodit: ObjectInputStream(InputStream in) Oliot voidaan tallentaa levylle käyttäen edellä mainittuja FileInputStreamia ja FileOutputStreamia. Tällöin täytyy näiden lisäksi käyttää ObjectInputStream ja ObjectOutputStream –luokkia, jotka hoitavat sarjallistamisen ObjectInputStreamin metodit: ObjectInputStream(InputStream in) luo uuden lukuvirran. Parametrina käy vaikka FileInputStream-olio, jollaisia edellä käsiteltiin.

Object readObject() lukee olion lukuvirrasta. Koska Javassa kaikki luokat ovat luokan Object periviä, voi tällä metodilla lukea minkä tahansa olion. Lisäksi luokassa ovat samat close(), mark() ja reset() metodit kuin BufferedReader-luokassa.

writeObject(Object obj) ObjectOutputStream ObjectOutputStream(OutputStream out) konstruktorissa voidaan käyttää parametrina FileOutputStream –oliota Muita metodeja: writeObject(Object obj) metodi kirjoittaa objektin, jonka voi lukea ObjectInputStreamin avulla Lisäksi käytössä ovat normaalit close() ja flush() -operaatiot

Esimerkki. Kirjoitetaan ja luetaan kolme oliota käyttäen tiedostoa t Esimerkki. Kirjoitetaan ja luetaan kolme oliota käyttäen tiedostoa t.tmp. FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Date()); oos.close();

FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt(); String today = (String) ois.readObject(); Date date = (Date) ois.readObject(); ois.close();

Tekstitiedoston parserointi Parserointi tarkoittaa jäsentelyä tutkitaan, miten voidaan lukea monimutkaisesta tekstitiedostosta halutut kohdat Periaatteena on, että tunnetaan tiedoston formaatti, ja tiedetään missä kohtaa halutut tiedot ovat Voidaan myös tuntea tekstin seasta avainsanoja, joiden jälkeen tiedetään seuraavan haluttu tieto

StringTokenizer(String str, String delim) Apuna käytetään StringTokenizer-luokkaa, jonka avulla voidaan paloitella merkkijono osiin: StringTokenizer(String str, String delim) luo Stringtokenizer-olion parametri str on merkkijono, joka halutaan jäsentää parametri delim on erotin merkkijonon eri osien välillä

boolean hasMoreTokens() int countTokens() Metodeja: String nextToken() palauttaa seuraavan osan tekstiä boolean hasMoreTokens() kertoo, onko vielä tekstiä käsittelemättä int countTokens() palauttaa jäljellä olevien tekstin osien määrän

Esim.: käsitellään opiskelijaa kuvaava merkkijonoa mjono=”paavo;väyrynen;TKT;2000”; StringTokenizer st=new StringTokenizer(mjono,”;”); String nimi=st.nextToken(); String suku=st.nextToken(); String ko=st.nextToken(); int aloitusvuosi=Integer. parseInt(st.nextToken());

Verkkoyhteyksien käyttäminen Javassa voi ottaa monenlaisia verkkoyhteyksiä Voi lukea sivuja HTTP-protokollalla Voi kutsua hajautettuja sovelluksia Voi ottaa socket-yhteyden Tutkitaan ensin pintapuolisesti vaihtoehtoa 3

Socket-yhteys Socket on kaksisuuntaisen keskusteluyhteyden toinen pää Palvelin kuuntelee yhteydenottopyyntöjä tietyssä portissa socketilla Asiakas lähettää yhteyspyynnön

Palvelin ottaa yhteyspyynnön vastaan ja antaa asiakkaan käyttöön uuden socketin, joka on jossain toisessa portissa Sitten palvelin jatkaa yhteydenottoportin kuuntelua, josko muutkin haluaisivat yhteyttä Asiakas kommunikoi palvelimen kanssa

Socketteja voidaan käyttää Javassa java Socketteja voidaan käyttää Javassa java.net-paketissa olevan Socket-luokan avulla. Socketit ovat alhaisen tason keskusteluväline HTTP-yhteydet käyttävät socketteja toteutuksessaan Java appletit eivät voi ottaa socket-yhteyksiä muualle kuin siihen palvelimeen, josta ne ladattiin

Hajautetut sovellukset Javassa voidaan sovelluksia hajauttaa Tämä tapahtuu mahdollistamalla metodikutsut verkon yli Yhdelle koneella toimiva ohjelma voi esittää metodikutsuja normaaliin tapaan käyttäen RMI-protokollaa Samalla voi siirtää parametreissa tietoa Hyvin tehokas korkean tason järjestelmä

HTTP-protokollan käyttö Javassa voi luoda HTTP-yhteyksiä Appletit eivät saa ottaa HTTP-yhteyksiä muualle kuin siihen koneeseen, josta ne ladattiin Java-sovellukset voivat käyttää HTTP-yhteyksiä vapaasti Ei vaadi www-palvelimelta mitään ylimääräistä

HTTP-yhteydet määrittelee URL-osoite URL=Uniform Resource Locator URL:n muoto on seuraava: URL koostuu siis kahdesta osasta, joita erottaa kaksoispiste Ensimmäisenä on protokolla, jota käytetään, toisena osoite, johon viitataan

URL-osoite voi viitata monenlaiseen protokollaan: ftp://ftp.mozilla.org/ http://www.it.utu.fi/ mailto:jussi.salmi@it.utu.fi Myös Gopher, News, File-protokollat http://www.it.utu.fi/ajankohtaista/ Osoitteessa näkyy protokolla, palvelin ja polku haluttuun tiedostoon. Pelkkä / palvelimen jälkeen tarkoittaa index.html-tiedostoa

URL(String protocol, String host, String file) Javassa mallinnetaan URL:ää luokalla URL, joka löytyy java.net-paketista URL-luokka: konstruktori: URL(String spec) spec-parametri on URL-osoite URL(String protocol, String host, String file) Määritellään kaikki erikseen

Tiedostojen lukeminen URL:stä Tiedostojen lukemiseen tarvitaan lukuvirta URL:stä saadaan lukuvirta käyttämällä URL-luokan openStream-metodia: InputStream openStream() Metodi palauttaa InputStream-tyyppisen lukuvirran Tämä on siis tavuittain lukeva lukuvirta Sitä voidaan käyttää yhdessä vaikkapa ObjectInputStreamin kanssa lukemaan sarjallistettuja olioita

Seuraava ohjelma käyttää ObjectInputStreamia olioiden lukemiseen aiemmasta esimerkistä, jossa talletettiin muutama olio levylle Huom! luettavan tiedoston tulee olla samalla palvelimella kuin appletti Tuloksena näytetään yhden olion sisältö Label-tyyppisessä tekstipalkissa Samalla tavalla voitaisiin lukea muitakin binääritiedostoja verkon yli

try { URL sivu = new URL("http://staff.cs.utu.fi/staff/jussi.salmi/tmp"); ObjectInputStream p = new ObjectInputStream(sivu.openStream()); int i = p.readInt(); String today = (String)p.readObject(); Date date = (Date)p.readObject(); p.close(); Label label = new Label(today); add(label); } catch (Exception e) {}

Tekstitiedostojen lukeminen Aiemmin käytettiin Reader-tyyppistä tiedostovirtaa tekstitiedostojen lukemiseen URL-luokassa on kuitenkin vain metodi tavutyyppisen tiedon lukemiseen On kuitenkin olemassa luokka InputStreamReader, joka mahdollistaa tavujen lukemisen virrasta merkkeinä Tekstiä voidaan lukea sitä käyttäen lisäksi voidaan käyttää mitä tahansa haluttua lukijaa merkkien lukemiseen

Esimerkki tekstitiedoston lukemiseen verkon yli käyttäen BufferedReader-luokkaa BufferedReader vaatii konstruktorissaan jonkin Reader-tyyppisen olion InputStreamReader on itse Readerin perillinen, mutta se vaatii konstruktorissaan InputStream-tyyppistä parametria Niinpä se käy BufferedReaderille ja hyväksyy openStream-metodin palauttaman InputStream-virran

try { URL url = new URL("http://staff.cs.utu.fi/staff/jussi.salmi/tekstitiedosto"); InputStreamReader isr= new InputStreamReader( url.openStream()); BufferedReader br=new BufferedReader(isr); String teksti=isr.readLine(); isr.close(); } catch (Exception e) {}

Tiedostoon kirjoittaminen verkon yli Tämä on paljon vaikeampaa Lukemisessa riittää, kun luettava tiedosto on laitettu oikeaan paikkaan palvelimelle Kirjoittamisessa täytyy jonkun olla palvelimen päässä kuuntelemassa kirjoituspyyntöjä Appletissa on helppoa lähettää kirjoituskutsuja Tällä kurssilla ei tarvitse oppia kirjoitusta

URL-luokassa on metodi URLConnection openConnection() avaa yhteyden URL:ään palauttaa URLConnection-olion, jota voi käyttää niin lukemiseen kuin kirjoittamiseen openStream-metodi käyttää oikeastaan myös openConnection-metodia URLConnection-luokassa on metodi void setDoOutput (boolean dooutput) laitetaan dooutput todeksi, jolloin voidaan kirjoittaa seuraavan esimerkin mukaisesti

Kirjoittaminen tapahtuu hyväksikäyttäen cgi-bin-menetelmää Tällöin palvelimella on määrätty cgi-bin hakemisto, johon sijoitetaan ohjelmat, jotka osaavat käsitellä verkon yli tulevaa tietoa. Jotta seuraava ohjelma toimisi, tulee palvelimella java.sun.com olla olemassa cgi-bin –hakemistossa ohjelma backwards Samalla menetelmällä toimivat mm. verkossa täytettävät HTML-lomakkeet

URL url = new URL("http:// java.sun.com/cgi-bin/backwards"); URLConnection c = url.openConnection(); c.setDoOutput(true); PrintWriter out = new PrintWriter(c.getOutputStream()); out.println(“morjens!”); out.close();

Poikkeustenkäsittely Ohjelmia suoritettaessa tulee tilanteita, jolloin suorituksessa oleva metodi ei pysty jatkamaan suoritusta Tämä voi johtua virheellisestä syötteestä tai vaikkapa jonkin ohjelman ulkopuolelta pyydetyn palvelun epäonnistumisesta Tällainen voi tapahtua vaikkapa tilanteessa, jossa tiedoston luku tai verkkoyhteyden otto epäonnistuu

Ensimmäiseksi metodi yrittää toipua virheestä. Tämä ei aina onnistu. Tämä jälkeen seuraa tilanne, jossa ongelma on hoidettava ylemmällä tasolla. Metodi itse ei välttämättä tiedä, mihin kokonaisuuteen epäonnistunut tehtävä kuului, ja miten se vaikuttaa ohjelman suorituksessa eteenpäin Muissa ohjelmointikielissä tämä tilanne voitaisiin hoitaa lopettamalla aliohjelman suoritus ja palauttamalla tieto virheestä

Javassa on kuitenkin käytössä erillinen poikkeuskäsittely Poikkeus on ilmoitus kohdatusta virhetilanteesta Tällöin metodi virheen kohdatessaan, kun se ei pysty itse virheestä toipumaan, nostaa poikkeuksen. Poikkeus lopettaa metodin suorituksen, kontrolli palaa metodia kutsuneelle metodille

Tämä ratkaisee, osaako se toipua kohdatusta virheestä Jos luokassa ei ole virheenkäsittelyosiota, jatkaa poikkeus ylemmälle tasolla Poikkeus palaa ylöspäin kutsupinossa, kunnes joku sen käsittelee Jos ei kukaan osaa käsitellä, ohjelman suoritus päättyy

Poikkeus on teknisesti toteutettu luokkana sekä mekanismina poikkeuksien välittämiseen Luokan attribuutit kertovat millaisesta virhetilanteesta on kysymys ja minkä metodien kautta virhe on tullut Poikkeusten käsittelymekanismi on seuraava:

try { } määrittelee lohkon, josta voi syntyä poikkeus Mikäli metodissa suoritetaan operaatioita, jotka voivat nostaa poikkeuksen, täytyy ne laittaa try-lohkoon try-lohkon jälkeen on catch –lohko, jossa virheet käsitellään catch-lohkoja voidaan määritellä useita erilaisille virhetilanteille finally-lohkossa estitetään toimenpiteet, jotka suoritetaan joka tapauksessa

Poikkeuksia on kiinniotettavia (checked) ja läpipäästettäviä (unchecked). Läpipäästettäviä ei tarvitse ottaa kiinni try-catch-rakenteella Läpipäästettävät poikkeukset ovat RuntimException-luokan perillisiä Muut poikkeukset täytyy ottaa kiinni, tai ne täytyy määritellä metodin otsikossa throws-määreellä. throws-määre kertoo, metodi lähettää eteenpäin määreessa ilmoitetun virheen

try { File f=new File(”uusi”); f.createNewFile(); //throws IOException } catch (IOException e) { //käsitellään IO-poikkeus finally { //suoritetaan joka tapauksessa

public void esim(File f) throws IOException { f.createNewFile(); }

Luokka Throwable on kaikkien Javan virheitä käsittelevien luokkien yliluokka Sen jälkeläiset jakaantuvat kahteen ryhmään: Error ja sen jälkeläiset ovat vakavia ongelmia, jotka eivät liity Javan tavalliseen käyttöön; ohjelmoijan ei tarvitse niistä välittää Exception käsittelee normaaleja virhetilanteita, jotka voivat liittyä normaaliin ohjelman toimintaan

Exception(String message) Luokka Exception konstruktorit Exception(String message) Luo uuden poikkeuksen, johon liittyy virheilmoitus message Exception(String message, Throwable cause) Tähän liittyy myös poikkeuksen syy, joka on itsessään jokin poikkeus. Tarkoituksena on välittää viesti siitä, mikä virheen aiheutti. Käyttäen tätä ylempi taso ei ole sidottu alemman tason toteutukseen.

try { lowLevelOp(); } catch (LowLevelException le) { throw new HighLevelException(le); // ketjuuntuva konstruktori

Omien poikkeusten määrittely Poikkeuksia voi itse määritellä Käyttäen jo olemassa olevia poikkeuksia Periyttämällä oman poikkeusluokan Exception-luokasta Tapauksessa 1 voidaan toimia vaikkapa näin:

public void tutkiLuku(int l) throws Exception { final int MIN=10; final int MAX=25; Exception ongelma= new Exception (”Luku ei ole arvovälillä”); if (l<MIN || l>MAX) { throw ongelma; }

Tapauksessa 2 pitää periä Exception-luokka, muuten Java ei ymmärrä kyseessä olevan poikkeuksen Tällöin voidaan poikkeukseen määritellä omia toimintoja kuten yleensäkin perittäessä Yleisesti ottaen kuitenkin perityn poikkeuksen tärkein anti on se, että sen nimi kuvastaa tapahtunutta tilannetta Edellinen esimerkki käyttäen omaa poikkeusta

public class LukuKelvoton extends Exception { public LukuKelvoton(String v) { super(v); }

public void tutkiLuku(int l) throws LukuKelvoton { final int MIN=10; final int MAX=25; LukuKelvoton ongelma= new LukuKelvoton (”Luku ei ole arvovälillä”); if (l<MIN || l>MAX) { throw ongelma; }

Java-ohjelmien dokumentointi Dokumentaatiolla on monta tehtävää Dokumentaatio kertoo ohjelmoijalle, mitä hän on ohjelmaa kirjoittaessaan ajatellut ohjelmansa tekevän. Dokumentaatio kertoo muille kuin ohjelmoijalle, mitä ohjelma tekee. Tätä tarvitaan, kun he joutuvat ylläpitämään sitä Dokumentaatio voi sisältää oikeellisuuden toteamiseen tarkoitettuja väitteitä Dokumentaatio toimii käyttöohjeena

Dokumentaatiota on monenlaista Ohjelmakoodin kommentointi Ohjelman sekaan kirjoitetut kommentit Auttavat ohjelmakoodin toiminnan ymmärtämistä Hyödyllistä, kun ohjelmaa pitää muuttaa Ohjelmakoodin koottu tekninen dokumentointi Kertoo, mitä metodeja tai luokkia ohjelmassa on, ja miten niitä käytetään Auttaa ymmärtämään ohjelman korkeamman tason toimintalogiikkaa

Ohjelman käyttäjälle suunnattu dokumentaatio Tällaista dokumentaatiota tarvitsee henkilö, joka käyttää luokkia ja metodeja hyödyksi omassa ohjelmassaan Ohjelman käyttäjälle suunnattu dokumentaatio Ei kuvaa ohjelman sisäistä toimintaa, vaan kertoo miten sitä käytetään

Ohjelmakoodin kommentointi on eri kielissä samankaltaista Syntaksi kommenttien kirjoittamiseen vaihtelee Javassa kommentin erottimena toimii ”//” yksiriviselle kommentille ”/* kommentti */” moniriviselle kommentille Samat kommentointikonventiot ovat käytössä myös C++:ssa

Ohjelmakoodin teknisessä dokumentoinnissa Javassa on käytössä apuväline, JavaDoc JavaDoc nojautuu tietyllä formaatilla kirjoitettuun kommentointiin Dokumentoinnilla saadaan aikaiseksi luokkien kuvaukset sekä metodien kuvaukset parametreineen, palautusarvoineen sekä poikkeuksineen helposti luettaviksi HTML-tiedostoiksi

JavaDoc-kommenttien formaatti /**Tämän metodin tarkoituksena *on palauttaa kahdesta luvusta *suurempi. *<p> *Metodi palautuu aina *@param x Toinen luku *@param y Toinen luku *@return suurempi parametreista x ja y *@ see Integer

Tehtävänanto juuri sellaisena kuin se on sovittu tai määritelty Harjoitustyön dokumentoinnista tulisi käydä ilmi ainakin seuraavat asiat: Tehtävänanto juuri sellaisena kuin se on sovittu tai määritelty Ratkaisun periaatteet Missä ympäristössä tehtävä on ratkaistu Ratkaisun tunnetut ongelmat Mahdollisuudet jatkokehitykseen Ratkaisun yksityiskohtaisempi kuvaus Mitä luokkia ja metodeja on käytetty, mikä on niiden rooli kokonaisuuden kannalta

4. Testiajot 5. Ohjelmakoodi Pääasialliset tavat, miten kutsut tapahtuvat 4. Testiajot Mikäli kyseessä on graafinen ohjelma, dokumenttiin tulee laittaa selostus siitä, mitä testejä ohjelmalle on tehty sekä kuvaruutukaappauksia ohjelman toiminnasta Jos ohjelma antaa tuloksensa tekstinä komentoriville tai tiedostoon, on tulosteet syytä laittaa mukaan 5. Ohjelmakoodi Ohjelmakoodi liitetään dokumenttiin liitteenä

Tapahtumankäsittely Applettiin ja tavalliseen sovellukseen voi lisätä graafisia komponentteja, kuten painonappuloita ja valintaruutuja. Niihin voi kirjoittaa tekstiä, piirtää kuvia yms., mutta hyödyllistä olisi myös, jos ne voisivat käynnistää jotain toimenpiteitä Tähän tarvitaan tapahtumankäsittelyä Tapahtuma (event) on luokka, joka kuvaa jotain tapahtunutta toimenpidettä, eri tapahtumatyypeille on omat luokkansa

Käyttäjän toimenpiteet, kuten painonappulan painaminen, generoivat tapahtuman. Tapahtumat sisältävät tietoa siitä, mikä komponentti ne on generoinut, mitä nappulaa käyttäjä on painanut

Hiireen liittyvät tapahtumat (MouseEvent): hiiren nappulaa on painettu hiiren nappula on vapautettu hiirellä on klikattu hiiri saapuu komponentin päälle hiiri poistuu komponentin päältä Hiiren liikkeet generoivat ylläolevat tapahtumat sille komponentille, jonka päällä hiiri sattuu olemaan, jos komponentti ottaa ne vastaan.

Komponentti ei reagoi tapahtumiin, ellei sille ole määritelty tapahtumankäsittelijää näille tapahtumilla Hiiren liikkeitä käsittelee MouseMotionListener-tapahtumankäsittelijä-rajapinta Hiiren nappuloiden painalluksia käsittelee MouseListener-tapahtumankäsittelijä-rajapinta Tässä rajapinnassa on seuraavat metodit

void mouseClicked(MouseEvent) void mouseEntered(MouseEvent) Kutsutaan kun hiiren nappulaa napsautetaan void mouseEntered(MouseEvent) Kutsutaan kun hiiri osuu komponentin alueelle void mouseExited(MouseEvent) Kutsutaan kun hiiri häipyy alueelta void mousePressed(MouseEvent) Kutsutaan, kun hiiren nappula painetaan alas void mouseReleased(MouseEvent) Kutsutaan kun edelläoleva tilanne päättyy

Tällä oliolla on mm. seuraavat metodit: public int getButton() Kaikki edellämainitut metodit saavat parametrina MouseEvent-tyyppisen tapahtumaolion Tällä oliolla on mm. seuraavat metodit: public int getButton() mitä nappia painettiin (1=vasen, 3=oikea) public int getClickCount() Kuinka monta klikkausta tapahtui public int getX() missä tapahtuma tapahtui

Graafisten komponenttien käyttäminen tapahtumankäsittelijöiden kanssa Graafisia komponentteja olivat AWT:ssa seuraavat mm.: Button, CheckBox, Choice, List, TextArea, TextField Näihin voi liittyä toimintoja kuten nappulan painaminen, valinnan tekeminen listasta, kirjaimen kirjoittaminen tekstikenttään jne. Tapahtumat käsitellään asiaanliittyvillä tapahtumankäsittelijöillä

Katsotaan, miten tapahtuma käsitellään Buttonin tapauksessa Tarpeellinen tapahtumankäsittelijä on ActionListener-rajapinta Tässä on vain yksi toteutettava metodi: void actionPerformed( ActionEvent e) Kutsutaan, kun nappulaan kohdistuu tapahtuma Tapahtumaa kuvaa ActionEvent-luokka

ActionEvent-luokka ActionEvent kuvaa tapahtumaa kuten nappulan painamista Button-tyyppisessä komponentissa ActionListener–rajapinnan toteuttavassa luokassa nappulan painallus aiheuttaa kutsun metodille actionPerformed(ActionEvent e) Parametrina välitetään ActionEvent-olio

Luokan tärkeimmät metodit: public String getActionCommand() palauttaa esim. nappulan tekstin public int getModifiers() palauttaa tiedon, painettiinko samalla Shift, Control, tms. näppäimiä

Muita tapahtumankäsittelijöitä WindowListener ComponentListener kuuntelee, sulkeutuuko ikkuna ComponentListener kuuntelee, tuleeko graafinen komponentti näkyville FocusListener kuuntelee, aletaanko komponenttiin kirjoittaa ListSelectionListener kuuntelee, tehdäänkö listasta valinta