Muusika Java 1.0 võimaldas vaid rakendi abil au-formaadis faile mängida. Versiooon 1.2 suudab mängida ka muid failitüüpe ning mängimiseks pole tarvis brauseri abi. Sellegipoolest piirduvad muusikavõimalused vaid varem valmistatud klippide esitamises. Varieerida oli võimalik vaid lõikude mängimise aega ja kestust. Tõenäoliselt aasta 2000 kevadel valmivasse JDK 1.3 juurde kuuluvad paketid nii MIDI-kujul kui lindistatud muusika loomiseks, talletamiseks, töötlemiseks ja esitamiseks. Alates 1999 sügisest saab kasutada 1.3 beetaversiooni, mis on mõeldud katsetamiseks enne uue valmisversiooni väljalaskmist. Kuigi kõik pole veel lõplikult valmist (kuid nagu öeldakse, ei saa tarkvara kunagi päris valmis), saab temaga täiesti programme luua. MIDI MIDI muusikal salvestatakse (või antakse edasi) nootide helikõrgusi ning kestusi (heli alguse ja lõpu aega). Muusika taasesituseks luuakse pilliheli näidiste ning nootide järgi muusika. Audio-kujul signaali väljastab Synthesizer (sünteesija), kes saab helinäited Soundbank'ist (kõlabaas) ning nootide mängimise ajad Sequencerist (järjestaja). Sünteesija käest saab ka otse küsida midi kanal(id) ning neis määrata, millal ja millist nooti mängida. Üksikud noodid Järgnevas näites küsitakse süsteemi käest sünteesija, avatakse ta. Kõlabaasist laetakse pill ning määratakse sünteesija teda mängima. Sünteesija käest küsitakse kanal ning viimases pannakse mängima kaks nooti. MidiSystem.getSynthesizer(null) küsib sünteesija. Parameeter null näitab, et oodatavale sünteesijale ei seata eeltingimusi. Kanalitest võetakse esimene (s.t. nr. 0) ning määratakse ta mängima noote nr 60 (C) ning 70 (B). Meetodi teine parameeter näitab instrumendi klahvi vajutamise kiirust (sageli see seostub heli tugevusega). import javax.media.sound.midi.*; public class K1{ public static void main(String argumendid[]) throws Exception{ Synthesizer synthesizer=MidiSystem.getSynthesizer(null); synthesizer.open(); Instrument pill=synthesizer.getDefaultSoundbank(). getInstruments()[0]; synthesizer.loadInstrument(pill); MidiChannel kanal=synthesizer.getChannels()[0]; kanal.noteOn(60, 60); kanal.noteOn(70, 60); } } Järgnev näide sarnaneb eelmisega, kuid järjest mängitakse palju noote (aletes numbrist 40). Iga nooti lastakse 200 millisekundit kõlada ning seejärel noodi mängimine lõpetatakse. import javax.media.sound.midi.*; public class K2{ public static void main(String argumendid[]) throws Exception{ Synthesizer synthesizer=MidiSystem.getSynthesizer(null); synthesizer.open(); Instrument pill=synthesizer.getDefaultSoundbank(). getInstruments()[0]; synthesizer.loadInstrument(pill); MidiChannel kanal=synthesizer.getChannels()[0]; for(int i=40; i<120; i++){ kanal.noteOn(i, 60); Thread.sleep(200); kanal.noteOff(i); } } } Rajad Kui eelmistes näidetes juhiti MIDI kanaleid otse, siis siin kasutatakse Sequenceri (järjestaja) ning radade (Track) abi. Alustuseks loon raja. Siis lisan sinna MIDI sündmused (sündmuse ID, noodi nr., klahvi kiirus, toimumise aeg). Raja paigutan järjestusse (Sequence), selle omakorda järjestajasse. Küsin sünteesija ning palun järjestajal saata teated sünteesijasse. Kui ütlen järjestajale start, siis asub ta teateid saatma ning sünteesija mängib nende järgi loo. //Kokkupandud lugu import javax.media.sound.midi.*; public class K3{ public static void main(String argumendid[]) throws Exception{ Track track=new Track(); ShortEvent sev=new ShortEvent(); sev.setMessage(192, 0, 65, 0); //raja algus track.add(sev); sev=new ShortEvent(); sev.setMessage(144, 43, 65, 1); //144 - noodi algus track.add(sev); sev=new ShortEvent(); sev.setMessage(128, 43, 65, 100); //128 - noodi ots track.add(sev); Sequence sc=new Sequence(Sequence.PPQ, 1); sc.add(track); Sequencer seq=MidiSystem.getSequencer(null); seq.open(); seq.setSequence(sc); Synthesizer synthesizer=MidiSystem.getSynthesizer(null); synthesizer.open(); seq.addOutReceiver(synthesizer); seq.start(); } } Faili mängimine MIDIfaili mängimiseks loetakse teated failist. Käsuga setSequence saab panna järjestaja teateid failist lugema. Nagu eelmiseski näites, saadetakse väljund sünteesijasse ning sealtkaudu kuulajani. FileInputStreamile on lugemiseks ümber pandud BufferedInputStream, et lugedes oleks võimalik mõnda lõiku mitu korda läbida. Lisaks mängimisele on failist tulevaid andmeid võimalik vajadusel muuta või analüüsida. // Midifaili mängimine import javax.media.sound.midi.*; import java.io.*; public class K4{ public static void main(String argumendid[]) throws Exception{ Sequencer seq=MidiSystem.getSequencer(null); seq.open(); seq.setSequence( new BufferedInputStream( new FileInputStream("SAMPLES\\CANON.MID") ) ); Synthesizer synthesizer=MidiSystem.getSynthesizer(null); seq.addOutReceiver(synthesizer); synthesizer.open(); seq.start(); } } Dokumenteerimine Paarist reast pikemate programmide mõistmiseks ei pruugi põgusast pealevaatamisest piisata. Meetodite ja klasside nimed veidi selgitavad olukorda, kuid peetakse sobivaks ka pikemaid seletusi programmilõikude töö ning kasutusvõimaluste kohta anda. Enesel on nii lihtsam koodi meelde tuletada ning annab grupitöö korral võimaluse teistel programmeerijatel tehtut kasutada, ilma et peaks autorilt selgitusi pärima või iga programmirea eesmärki eraldi uurima. Java lähtekoodi saab kommentaare lisada kahel moel. Tekst kahest järjestikusest kaldkriipsust rea lõpuni loetakse kommentaariks näiteks: int arv=3 // kassi poegade arv // poegade arvu järgi tuleb arvestada toiduvajadust double toidukulu=arv*koefitsient Pikemat programmi osa saab välja kommenteerida märkides selle osa alguse ja lõpu. Algust tähistab /* ning lõppu */ . Valikuvõimaluse puhul soovitakse kasutada ridade kaupa väljakommenteerimist, pidada vähem vigu tekkima. Programmifaile iseloomustavate HTML-lehtede loomiseks kuulub JDK programmide koosseisu javadoc, mis koondab programmidest meetodite kirjeldused koos vastavalt märgistatud kommentaaridega. Vastavalt sihtgrupile võib lasta javadocil välja tuua mitmesuguse tähtsusastmega programmiosi. Näiteks kaasprogrammeerijatele tuleks näidata ka vaid paketi või klassi piires kasutatavaid muutujaid, klassi väljapoolt kasutajale pole neid tarvis. Ka loob javadoc võimaluse korral viited muude klasside kirjeldustele. Javadoci abil on koostatud ka JDK API dokumentatsioon, mida abiinfona kasutame. Klassi ja meetodite kirjelduste lisamiseks javadoci abil loodud HTML-faili tuleb need kirjeldused paigutada javadocile mõistetavalt kujundatuna klassi või meetdi ette. Äratundmiseks peab kommentaar algama reaga, millel kaldkriips ja kaks tärni. Iga rea algul on üks tärn ning kommentaari lõpus tärn ja kaldkriips. Kirjelduse sees võib kasutada HTML kujundust. Erikirjelduste abil saab määrata tunnuste väärtusi. @author tähendab programmifaili autorit (neid võib olla ka mitu), @since versiooni, millest alates seda programmi kompileerida ning kaivitada saab. /** * Klass abistab kasutajat * punkti andmete hoidja ning analüüsijana * @author Jaagup Kippar * @since JDK1.0 */ public class DokPunkt{ public int x, y; /** * Parameetriteta konstruktor, jätab muutujate väärtused nulliks */ public DokPunkt(){ x=y=0; } /** * Konstruktor lähteandmete sisestamiseks. *

* Konstruktoris määratud parameetrid jäävad * vastavate muutjate väätusteks * @param x loodava punkti x-koordinaat * @param y loodava punkti y-koordinaat */ public DokPunkt(int x, int y){ this.x=x; this.y=y; } } Javadoc võimaldab luua kirjeldused meetodite, klasside ja pakettide kohta. Lisaks sellele on siiski sageli viisakas lisada "kirjeldav" ülevaade ning kasutamisõpetus. Kahendkoodi analüüs Programmi luues kirjutab programmeerija tekstifailina käskluste jada, kompilaator muudab sõnalised käsklused kahendkoodis käsklusteks, mida on intepretaatoril mugavam lugeda. Lisaks sellele optimeeritakse kompileerimise käigus, nii et tegevused, mida on võimalik sooritada enne programmi töö alustamist (näiteks konstantsete avaldiste välja arvutamine) oleksid programmi töö algul juba valmis. Programmi töö tulemuslikkus sõltub tema kahendkoodist. Kui erinevate lähtetekstide tulemusena luuakse sama kahendkood, siis programm töötab ühtemoodi, ükskõik millise lähteteksti abil kahendkood loodi. Kahendkoodi (.class faili) on võimalik lugeda vahetult, kuid javap nimeline programm aitab seda tööd kergendada. Ta võimaldab eraldada klassist meetodid, et teaks klassi kasutada ka siis, kui lähtekoodi pole käepärast. Samuti on võimalik kahendkäsud teisendada assemblerilaadsele kujule, kus kahendarvude asemel on veidi enam inimkeelsed käsud. Näitena meetod public static int liida(int a, int b){ return a+b; } näeb assembleriks muudetuna välja Method int liida(int, int) 0 iload_0 1 iload_1 2 iadd 3 ireturn ehk lahtiseletatult: Meetod liida saab parameetriks kaks täisarvu ning väljastab täisarvu. Loetakse sisse esimese parameetri väärtus, siis teise väärtus, siis liidetakse väärtused kokku ning väljastatakse tulemus. Enamjaolt on mõeldud selline "lahti lahutamine" koodi analüüsiks, algoritmide optimaalseks muutmiseks. Enamasti tuleks siiski programm käskude abil valmis kirjutada ning siis vajadusel kahendkoodi otstarbekust analüüsida. Java standartsete vahendite hulgas ongi vaid javap lahti harutamiseks, kuid ajapikku on loodud ka assamblerist kahendkoodi tegemise programme. Ühe sellise saab enesele laadida näiteks aadressilt http://www-personal.umich.edu/~mcafee/java/ , programmil nimeks Java Grinder. Sellise programmi abil saab omapoolt parandatud assembleri koodi taas käivituvaks kahendkoodiks muuta. Nii saab virtuaalmasina käskude tasemel muuta programmi tööd. Samuti saab selle abil uurida ja muuta võõrast programmi (näiteks rakendit), millest kätte on võimalik saada vaid kahendkood. Sellist tegevust ei peeta küll viisakaks, kuid eks see ole rohkem südametunnistuse asi. Andmebaasiühendus JDBC (Java Database Connectivity) võimaldab java programmidel võimaldab (aitab) Java programmidel pidada sidet andmebaasi(de)ga ning töödelda andmeid. Suhelda saab andmebaasidega, millede jaoks on olemas draiverid. Suur osa andmebaase suudab suhelda ODBC abil ning JDBC-ODBC silla abil saab Java programmiga neile ligi. Ka on loodud draivereid muude andmebaasidega suhtlemiseks. Üks selline vabalt kasutatav ning väike ja õppimiseks küllalt sobiv baas on MiniSQL. Andmete vahetamiseks tuleb luua ühendus draiveri, baasi aadressi, kasutajanime ning parooli abil. Edasi saab SQL-keele abil baasiga andmeid vahetada. Lisaks sellele "madala taseme" ühendusele saab lisakäskude abil ka keerukamaid päringuid esitada. Suurt osa andmebaasivahenditest alles töötatakse välja. Tüüpiline ühendus andmebaasiga peaks väliselt enamasti olema näha järgmine: Connection con = DriverManager.getConnection ( "jdbc:odbc:wombat", "login", "password"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); } Lisavõimalusi Forte-elektronkaubandus, JavaMail - kirjasaatmisprogrammide koostamiseks, päiseridade ja manustega (attachment) tegelemiseks. Java Cryptography Extension aitab säilitada ning üle kanda salastatud infot. Sama eesmärki aitab saavutada Java Secure Socket Extension. RMI võimalab käivitada meetodeid teise arvutisse üles pandud RMI serveris. Nii on võimalik koodi kopeerimata kasutada sama meetodit eri kataloogides või masinates asuvatel programmidel. Java Telephony API võimaldab andmeid vahetada telefoni kaudu, saata andmeid välja ning reageerida sisse tulevatele kõnedele. Java3D aitab luua kolmemõõtmelist graafikat kasutavaid programm. Soovi korral pääseb programmeerija suuremast matemaatikast, kuid ei pea programmi töökiiruses oluliselt järele andma. Saab kasutada valmis kujundeid (kuup, kera, ruumiline tekst), samas ka ise kujundeid juurde luua. Aasta 2000 alguses loodetakse esimene valmisversioon kasutamiseks välja anda, seni on võimalus katsetada beetaversioone või lihtsalt ise välja arvutada joonte ja pindade kolmemõõtmeline paigutus. Jini on loodud toime tulema "poolarvutitel" nagu laserplaadimängija, mobiiltelefon ja programmeeritav pesumasin. Tema abil peaks saama esemeid automaatselt eri kohtades võrku ja võrgust välja lülitada. Java Advanced Imaging aitab pilte töödelda. Tema abil saab lugeda ja kirjutada pilte mitmes formaadis (gif, jpg, bmp), analüüsida ja muuta pilte (värv, paigutus, suund).