IN105-javainnogut-1 © Institutt for informatikk - høsten 2000 IN105-javainnogut-3 Hva heter du? Ludvig van Beethoven Goddag, Ludvig van Beethoven snidil:> import java.io.*; class Hilsen{ // side 97 i læreboka public static void main (String [ ] args) throws IOException { new Hilsen ( ) ; } Hilsen ( ) throws IOException { BufferedReader tastatur = new BufferedReader (new InputStreamReader(System.in)); System.out.println("Hva heter du?"); String name = tastatur.readLine ( ); System.out.println("Goddag, " + name); snidil:>javac Hilsen.java } snidil:>java Hilsen } Data fra tastaturet - eksempel © Institutt for informatikk - høsten 2000 Litt om pakker og mest om data inn og ut buffer String readLine( ) © Institutt for informatikk - høsten 2000 Double valueOf( ) int parseInt( ) IN105-javainnogut-4 double parseDouble( ) Double String readLine( ) Integer int heltall = Integer.parseInt(tastatur.readLine( ) ); …….. double flyttall = Double.parseDouble( tastatur.readLine( ) ); tastatur IN105-javainnogut-2 BufferedReader Data inn fra tastatur Lesing av tall – ett pr. linje © Institutt for informatikk - høsten 2000 import java.io.*; ……. BufferedReader tastatur = new BufferedReader (new InputStreamreader (System.in)); …. …. } lesemetode tastatur BufferedReader BufferedReader tastatur = new BufferedReader InputStreamReader (new InputStreamReader (System.in)); … String streng; streng = tastatur.readLine ( ); // leser en linje fra tastaturet void lesemetode (String [ ] args) throws IOException { .. . /* sett opp et objekt 'tastatur' hvis metoder foretar bufret innlesing fra tastaturet */ import java.io.*; …. Data inn fra tastaturet © Institutt for informatikk - høsten 2000 IN105-javainnogut-5 © Institutt for informatikk - høsten 2000 IN105-javainnogut-7 o Legge pakken i nivået over arbeidsnivået og legge til en Classpath dit – jfr s.124. Krever kunnskap om operativsystem-kommandoen SET o Opprette en mappe classes under mappen jdk1.2 og legge pakken der – mappen classes ligger nemlig i Java standard Classpath o Legge pakken i samme mappe som programmene o Pakken må den ligge i en "Classpath" – en måte å fortelle Java hvor den skal lete etter klasser. Dette kan gjøres på tre ulike måter: o Klassene ligger i en pakke kalt javagently som må importeres o Stream har de samme metodene, men knyttet til objekter som kontrollerer datastrømmer o Text innholder utelukkende klassemetoder – den er altså en verktøykiste – det er ikke meningen å lage objekter fra den. o Pakken javagently med klassene Text og Stream er skrevet av J. Bishop for å forenkle programmeringen av datainn og dataut Om pakken javagently og klassen Stream package javagently; import java.io.*; import java.util.*; import java.text.*; public class Text { ….. Eksempel: Pakken Javagently starter slik: * Hver fil kan gjerne inneholde flere klasser, men hver fil kan bare ha en klasse som er synlig utenfra (public). * Navnet på denne synlige klassen må også være navnet på filen. * Fra en fil til en annen i samme pakke kan man imidlertid få tak i alle klasser, metoder og variable (unntatt når disse er deklarert private). En pakke er en samling (Java)filer som ligger i en katalog. Katalogens navn er pakkens navn, og alle .java-filene må starte med: package <katalognavn>; Pakker } int readInt (...) © Institutt for informatikk - høsten 2000 tabulator, linjeskift. IN105-javainnogut-8 String streng = minskjerm.readString ( ); char readChar (...) ……… class Stream { double readDouble (...) Stream ( InputStream in ) { ... } Stream ( String filename, int why ) { ... } … public double readDouble ( ) { …. } public int readInt ( ) { …. } public char readChar ( ) { …. } public String readString (...) { …. } Klassen Stream leser ”tekstbiter” (engelsk: items) eller ……. tall som er adskilt med blank, } Stream minskjerm= new Stream ( System.in ) ; String readString (...) Stream IN105-javainnogut-6 interface Sortable { Filen Sortable.java package myutilities; Klassen javagently.Stream © Institutt for informatikk - høsten 2000 } ……open ( )……. class FileMan { Filen FileMan.java package myutilities; For å forenkle lesing og skriving har Judy Bishop laget en class Stream som behandler innlesing og utskrift fra fil og tastatur/skjerm: } class Dates { Filen Dates.java package myutilities; Dates.java FileMan.java List.java Sort.java Sortable.java Pakkestruktur snidil: java>mkdir myutilities snidil: java>cd myutilities/ snidil: myutilities>copy ~in105/javapakker/myutilities/*.java . snidil: myutilities>ls -l -rw------1 steing 1392 Feb 15 14:16 -rw------1 steing 626 Feb 15 14:16 -rw------1 steing 1800 Feb 15 14:16 -rw------1 steing 696 Feb 15 14:16 -rw------1 steing 95 Feb 15 14:16 snidil: myutilities> katalogen myutilities navn tastatur Greetings IN105-javainnogut-9 String readString ( ) String readLine( ) Stream Her lagres program og data under kjøring Primærlager 0 1 2 . . . . . . Databuss Disk Lokalnett © Institutt for informatikk - høsten 2000 CPU Her regner maskinen IN105-javainnogut-11 Her lagres program, oversatte programmer og data permanent (på filer) Her flyttes data og program fram og tilbake Lesing og skriving på filer på disk (platelager) © Institutt for informatikk - høsten 2000 snidil:>javac Hilsen.java snidil:>java Hilsen Hva heter du ? Pierre Godefroy God dag, Pierre snidil:> import java.io.*; import javagently.*; class Hilsen { public static void main ( String [ ] args ) throws IOException { new Hilsen ( ); } Hilsen ( ) throws IOException { Stream tastatur = new Stream (System.in); System.out.println("Hva heter du ?"); String navn = tastatur.readString( ); System.out.println("God dag, " + navn ); } } Bruk av javagently.Stream © Institutt for informatikk - høsten 2000 tekst = innfil.readString( ); dtall = innfil.readDouble( ); double dtall; String tekst; I det siste tilfellet kan vi bruke filen på samme måte som vi leste data fra tastaturet: tekst minfil.txt 123.54 Forelesning Dette objektet leser fra filen ”minfil.txt” innfil Stream innfil = new Stream(”minfil.txt”, Stream.READ); BufferedReader innfil = new BufferedReader (new FileReader (”minfil.txt”)); eller: Først må vi lage en forbindelse med filen, det gjør vi med enten nyttall sum tel tastatur SumTast Stream dtall IN105-javainnogut-12 Stream IN105-javainnogut-10 snidil: >javac SumTast.java snidil: >java SumTast Tast inn noen tall, avslutt med 0: 34 23 23 34 56 78 362 0 Du skrev 8 tall. Summen av tallene er: 610 snidil: java> Innlesing fra fil © Institutt for informatikk - høsten 2000 import java.io.*; import Stream; class SumTast { public static void main (String [] args) throws IOException { new SumTast ( ); } SumTast ( ) throws IOException { Stream tastatur = new Stream (System.in); int nyttall = 1; int sum = 0; int tel; System.out.println("Tast inn noen tall, avslutt med 0: "); for (tel = 0; nyttall != 0 ; tel ++) { nyttall = tastatur.readInt( ); sum += nyttall; } // end for-løkke System.out.println("Du skrev " + tel + " tall."); System.out.println("Summen av tallene er: " + sum); } } Summering av tall fra tastaturet Innlesing fra fil Filen ”minfil.txt” (laget f.eks. med emacs) utfil.close( ); © Institutt for informatikk - høsten 2000 For at innholdet på den nye filen skal bevares må vi til slutt si: utfil.println( ”utskrift” + 17 ); // Utskrift skjer som til skjerm: resultat tall innfil SumFil Dette objektet leser fra filen ”minfil.txt” Stream void println() Stream IN105-javainnogut-15 minutfil.txt Dette objektet skriver på filen ”minutfil.txt” utfil SkrivFil IN105-javainnogut-13 1256 345 245 345 1234 5576 43321 098098 8584 7588 3450 87544 9876 4332 8540289 Stream utfil = new Stream (”minutfil.txt”, Stream.WRITE); eller: PrintWriter utfil = new PrintWriter (new FileWriter (”minutfil.txt”)); Utskrift til fil © Institutt for informatikk - høsten 2000 snidil: java>javac SumFil.java snidil: java>java SumFil Summen er 8812083 snidil: java> import java.io.*; import Stream; class SumFil { public static void main (String [] args) throws IOException { new SumFil ( ) ; } SumFil ( ) throws IOException { int resultat = 0, tall; Stream innfil = new Stream ( "minfil.txt", Stream.READ ); for (int tel = 1; tel<= 15 ; tel ++) { tall = innfil.readInt( ); resultat += tall ; }// end for-løkke System.out.println("Summen er " + resultat); } } // end SumFil } } © Institutt for informatikk - høsten 2000 System.out.print("Postnummer: "); tekst1= tastatur.readString( ); System.out.print("Poststed: "); tekst2= tastatur.readString( ); filut.println("Poststed: "+ tekst1 + " " + tekst2); filut.close( ); System. out.println("er skrevet på \"minutfil.txt\""); System.out.print("Gatenavn: "); tekst1= tastatur.readString( ); System.out.print("Gatenummer: "); tekst2= tastatur.readString( ); filut.println("Adresse: "+ tekst1 + " " + tekst2); System.out.print("Fornavn: "); tekst1= tastatur.readString( ); System.out.print("Etternavn: "); tekst2= tastatur.readString( ); filut.println("Navn: " + tekst1 + " " + tekst2); Utskrift til fil - eksempel import java.io.*; import Stream; class InnUt { public static void main (String [] args) throws IOException { new InnUt ( ) ; } InnUt ( ) throws IOException { String tekst1, tekst2; Stream tastatur = new Stream (System.in); Stream filut = new Stream ("minutfil.txt", Stream.WRITE ); Stein 2000 Gjessing © Institutt for informatikk - høsten Innlesing fra fil med antall Dette objektet skriver på filen ”minutfil.txt” IN105-javainnogut-16 snidil: java>java InnUt Fornavn: Per Etternavn: Petersen Gatenavn: Solhellinga Gatenummer: 12 Postnummer: 4990 Poststed: Søndeled er skrevet på "minutfil.txt" snidil: java> Navn: Per Petersen Adresse: Solhellinga 12 Poststed: 4990 Søndeled minutfil.txt filut IN105-javainnogut-14 Stream SumFil2 import java.io.*; innfil import Stream; class SumFil2 { antall public static void main (String [] args) throws IOException { new SumFil2 ( ) ; tall } Dette objektet resultat SumFil2 ( ) throws IOException { leser fra filen int resultat = 0, tall; ”lengdefil.txt” Stream innfil = new Stream ( "lengdefil.txt", Stream.READ ); int antall = innfil.readInt( ); for (int tel = 1; tel<= antall ; tel ++) { tall = innfil.readInt( ); resultat += tall ; }// slutt for-løkke 15 System.out.println("Summen er " + resultat); 1256 345 245 } 345 1234 5576 43321 } // slutt SumFil2 snidil: >javac SumFil2.java 098098 8584 snidil: >java SumFil2 7588 Summen er 8812083 3450 87544 snidil: > 9876 4332 8540289 Stream © Institutt for informatikk - høsten 2000 IN105-javainnogut-19 private StringTokenizer T; Integer private String S; parseInt public int readInt ( ) throws IOException { ……… if ( T==null ) refresh ( ); ……… while (true) { <og så hvis feil:> try { throw new NumberFormatException( ); return Integer.parseInt(T.nextToken( ) ); ……… } catch (NoSuchElementException e1 ) { ……... refresh ( ); } catch ( NumberFormatException e2 ) { System.out.println ( "Error in number, try again." ); } } } private void refresh ( ) throws IOException { S = in.readLine ( ); if ( S==null ) throw new EOFException( ); T = new StringTokenizer ( S ); } IN105-javainnogut-17 String readString (...) char readChar (...) int readInt (...) double readDouble (...) streamobjekt.readInt ( ) © Institutt for informatikk - høsten 2000 return Double.valueOf( tekst.trim( )).doubleValue( ); Derfor må metoden readDouble i Stream ta en tekst som tilsvarer et reelt tall og gjøre det om til et reelt tall: Klassen Double har en metode som tilsvarer parseInt. Men Stream har foreløpig ikke fått med seg det. ….. return( Integer.parseInt( tekst ) ); Metoden readInt vil returnere et heltall ved å gjøre en tekst ("token") om til et heltall ved hjelp av klassen Integer: Stream tastatur = new Stream ( System.in ); int tall; tall = tastatur.readInt( ); Lesemetoder i klassen Stream © Institutt for informatikk - høsten 2000 Skriv inn navnet ditt : John Coltrane sikrer at ut-bufferens innhold skrives ut med øyeblikkelig virkning. System.out.flush( ); .... String navn = tastatur.readLine ( ); System.out.flush(); System.out.print("Skriv inn navnet ditt : " ); IN105-javainnogut-18 No more tokens IN105-javainnogut-20 void ledetekst ( String tekst) { System.out.print ( tekst + " : "); System.out.flush ( ); } ... ledetekst ( "Skriv inn navnet ditt"); Ledetekster © Institutt for informatikk - høsten 2000 return yes J a Read in a line Create a tokenizer for it Get the next token Convert it to an integer no Stream tastatur = new Stream ( System.in ); ... Invalid number Print an error-message Is the tokenizer empty? o Generell algoritme for lesemetodene Innmaten i Stream resulterer i: int i = 9, j utfil.println utfil.println utfil.println 9 25 3456 IN105-javainnogut-21 25, k = 3456; Stream.format ( i, 10 ) ); Stream.format ( j, 10 ) ); Stream.format ( k, 10 ) ); © Institutt for informatikk - høsten 2000 = ( ( ( = ( ( ( © Institutt for informatikk - høsten 2000 IN105-javainnogut-23 Husk å sette av plass til eventuelt fortegn ! 25, k = 3456; Stream.format ( i, 3 ) ); Stream.format ( j, 3 ) ); Stream.format ( k, 3 ) ); Stream.format ( ) - for trang plass 9 25 3456 resulterer i : int i = 9, j utfil.println utfil.println utfil.println Stream.format ( ) - heltall s ( ( ( ( © Institutt for informatikk - høsten 2000 © Institutt for informatikk - høsten 2000 (IOException) - Andre feil. Disken er full! (EOFException) - Det er slutt på filen (FileNotFoundException) - Filen fins ikke IN105-javainnogut-24 IN105-javainnogut-22 Hvordan unngå 0.700000000000000342 ? = 43.14, t = 233.566, u = 0.999; Stream.format ( r, 10, 2 ) ); Stream.format ( s, 10, 2 ) ); Stream.format ( t, 10, 2 ) ); Stream.format ( u, 10, 2 ) ); Unntak ved lesing og skriving 3,00 43,14 233,57 1,00 resulterer i double r = 3, utfil.println utfil.println utfil.println utfil.println Stream.format ( ) - desimaltall IN105-javainnogut-25 © Institutt for informatikk - høsten 2000 IN105-javainnogut-27 navn: fortsett import java.io.*; import javagently.*; // Gsnitt2.java type: boolean .... throws IOException { snidil: >javac Gsnitt2.java Stream tastatur = new Stream ( System.in ); snidil: >java Gjsnitt2 int nyttall, sum = 0, tel; Tast inn noen tall, avslutt med 0: double gjennomsnitt; 45 34 boolean fortsett = true; System.out.print ( ”Tast inn noen tall, avslutt med 0: ” ); 23 34 456 0 Du skrev 5 tall. for ( tel = -1; fortsett ; tel ++) { Gjennomsnitter er: 118.4 nyttall = tastatur.readInt ( ); snidil: > if ( nyttall == 0 ) { fortsett = false; Her er en variant av det } else { samme programmet. Se sum += nyttall; på de små forskjellene. } Legg spesielt merke til }/ hvordan vi bruker en if (tel > 0) gjennomsnitt = (double) sum / tel; logisk variabel til å else gjennomsnitt = 0; kontrollere når vi skal System.out.println( ”Du skrev ” + tel + ” tall.” ); stoppe repetisjonen: System.out.println( ”Gjennomsnittet er: ” + gjennomsnitt ); } Finn gjennomsnitt - 2 © Institutt for informatikk - høsten 2000 } catch ( IOException e ) { System.out.println ( "Hva skjedde ? Jo,dette : " + e ); System.out.println ( e.message ( ) ); } } catch ( EOFException e ) { System.out.println ( "Vi leste hele filen."); Stream innfil; try { innfil = new Stream ("minedata.txt", Stream.READ ); while ( true ) { // løkka brytes ved unntak String linje = innfil.readLine ( ); } } catch ( FileNotFoundException e ) { System.out.println ("Obs, filen manglet !"); Hvordan håndtere unntakene ? © Institutt for informatikk - høsten 2000 Finn største tall gjennomsnitt nyttall sum tel tastatur GjsnittTast IN105-javainnogut-26 Dette objektet leser fra tastaturet int readInt ( ) Stream IN105-javainnogut-28 highest number import java.io.*; import javagently.*;// HighestValue.java ... throws IOException { Variablen highest Stream in = new Stream ( System.in ); inneholder høyeste System.out.println ( "** Finding the highest number **" ); verdi til nå System.out.println ( "How many numbers (1 or more)?" ); int n = in.readInt ( ); snidil: >javac HighestValue.java System.out.println("Type them in"); snidil: >java HighestValue System.out.print ( "1> " ); ** Finding the highest number ** int highest = in.readInt ( ); How many numbers (1 or more)? 4 int number; Type them in for (int i = 2; i <= n; i++) { 1> 234 System.out.print ( i + ”> ” ); 2> 6321 number = in.readInt ( ); 3> fem if (number > highest) { highest = number; } Error in number, try again. } 5 System.out.println("That's enough, thanks"); 4> 2463 System.out.println("The highest number was ” That's enough, thanks +highest); The highest number was 6321 snidil: > © Institutt for informatikk - høsten 2000 import java.io.*; import javagently.*; //Gsnitt1.java ... throws IOException { Stream tastatur = new Stream ( System.in ); int nyttall = 1, tel, sum; double gjennomsnitt; System.out.print ( ”Tast inn noen tall, avslutt med 0: ” ); for (tel = 0; nyttall != 0 ; tel ++) { nyttall = tastatur.readInt ( ); sum += nyttall; } tel --; if (tel > 0) gjennomsnitt = (double) sum / tel; else gjennomsnitt = 0; System.out.println(”Du skrev ” + tel + ” tall.”); System.out.println(”Gjennomsnittet er: ” + gjennomsnitt ); Finn gjennomsnitt © Institutt for informatikk - høsten 2000 Tre summer IN105-javainnogut-29 snidil: >javac Summation3.java import java.io.*; //Summation3, JG s.108 snidil: >java Summation3 import javagently.*; How many numbers? 6 ...throws IOException { 1> 34 Positivt tall Stream in = new Stream ( System.in ); 2> 56 int count; Positivt tall double total = 0, posTotal = 0, negTotal = 0, number; 3> -2 System.out.print ( "How many numbers?" ); Negativt tall 4> 0 count = in.readInt ( ); Negativt tall Øving: for (int i = 1; i <= count; i++) { 5> 34 Rett programmet slik System.out.println ( i+">" ); Positivt tall at det ikke skriver at 6> -23 number = in.readDouble( ); null er et negativt (eller Negativt tall total = total + number; That's enough, thanks. et positivt) tall if ( number > 0 ) { The total is 99.0 posTotal += number; The pos. total is 124.0 The neg. total is -25.0 System.out.println (”Positivt tall”); snidil: > } else { negTotal += number; System.out.println (”Negativt tall”); } // end if System.out.println("That's enough, thanks."); } // end for System.out.println("The total is " + total); System.out.println("The pos. total is " +posTotal); System.out.println("The neg. total is " +negTotal);