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