Lataa esitys
Esittely latautuu. Ole hyvä ja odota
1
Ohjelmointiprojekti I (2 ov) kevät 2003
Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö
2
Kurssin sisältö Appletit toimintaympäristö, filosofia
erot Java-ohjelmaan (application) rajapinnan metodit grafiikka www:n käyttö rajoitukset
3
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
4
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
5
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
6
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
7
Appletin käynnistäminen www-sivulta
<applet code=”sovelma.class” CODEBASE=” WIDTH=250 Height=70> <PARAM name=”etu” value=”Paavo”> <PARAM name=”suku” value=”Väyrynen”> </applet>
8
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
9
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
10
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
11
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
12
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
13
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); }
14
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);
15
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
16
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
17
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
18
AWT:ssa on monta erilaista komponenttia:
19
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
20
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.
21
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.
22
Frame Window:n alainen luokka, joka tulee koko ikkunan ja komponenttisäiliöiden väliin. Tässä on jo otsikko ja menut.
23
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
24
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
25
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
26
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))
27
Fontin käyttö: setFont(Font f) asettaa fontin. Esim.
setFont(new Font("TimesRoman",Font.BOLD, 36)) luokka Font määrittelee fontin.
28
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
29
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);
30
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ä
31
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)
32
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”)
33
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
34
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
35
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
36
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
37
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
38
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
39
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
40
Käsitellään seuraavaksi tekstitiedoston lukemista
Tekstitiedoston tiedostovirta kuuluu Reader-ryhmään Ryhmän yläluokka on Reader, jonka alaluokkana on mm. BufferedReader
41
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.
42
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
43
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
44
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
45
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”)
46
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
47
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.
48
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
49
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
50
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.
51
Tapaus 1:ssä haluttiin tallentaa olioita.
Jotta oliot voisi tallentaa, ne täytyy sarjallistaa
52
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
53
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.
54
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.
55
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.
56
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
57
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();
58
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();
59
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
60
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ä
61
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
62
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());
63
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
64
Socket-yhteys Socket on kaksisuuntaisen keskusteluyhteyden toinen pää Palvelin kuuntelee yhteydenottopyyntöjä tietyssä portissa socketilla Asiakas lähettää yhteyspyynnön
65
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
66
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
67
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ä
68
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ä
69
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
70
URL-osoite voi viitata monenlaiseen protokollaan:
ftp://ftp.mozilla.org/ Myös Gopher, News, File-protokollat Osoitteessa näkyy protokolla, palvelin ja polku haluttuun tiedostoon. Pelkkä / palvelimen jälkeen tarkoittaa index.html-tiedostoa
71
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
72
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
73
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
74
try { URL sivu = new URL(" 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) {}
75
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
76
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
77
try { URL url = new URL(" InputStreamReader isr= new InputStreamReader( url.openStream()); BufferedReader br=new BufferedReader(isr); String teksti=isr.readLine(); isr.close(); } catch (Exception e) {}
78
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
79
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
80
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
81
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();
82
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
83
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ä
84
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
85
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
86
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:
87
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
88
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
89
try { File f=new File(”uusi”); f.createNewFile(); //throws IOException } catch (IOException e) { //käsitellään IO-poikkeus finally { //suoritetaan joka tapauksessa
90
public void esim(File f) throws IOException {
f.createNewFile(); }
91
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
92
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.
93
try { lowLevelOp(); } catch (LowLevelException le) { throw new HighLevelException(le); // ketjuuntuva konstruktori
94
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:
95
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; }
96
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
97
public class LukuKelvoton extends Exception {
public LukuKelvoton(String v) { super(v); }
98
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; }
99
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
100
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
101
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
102
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
103
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
104
JavaDoc-kommenttien formaatti
/**Tämän metodin tarkoituksena *on palauttaa kahdesta luvusta *suurempi. *<p> *Metodi palautuu aina x Toinen luku y Toinen luku suurempi parametreista x ja y see Integer
105
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
106
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ä
107
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
108
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
109
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.
110
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
111
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
112
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
113
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ä
114
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
115
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
116
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ä
117
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
Samankaltaiset esitykset
© 2024 SlidePlayer.fi Inc.
All rights reserved.