JAVA Input/Output Programmazione ad Oggetti • Basato sul concetto di stream • Stream: sequenza ordinata di dati che hanno una sorgente (input stream) o una destinazione (output stream) • Astrazione dai dettagli del sistema operativo sottostante • Stessa interfaccia verso sorgenti dei dati diverse quali un file su disco, una connessione di rete o una stringa di caratteri Java Input-Ouput classes Marco Botta Dipartimento di Informatica - Universita` degli Studi d i Torino C.so Svizzera, 185 - I-10149 Torino (Italy) e-mail: botta@d i.unito .it - URL: http://www.di.unito.it/~botta Slide design: Matteo Baldoni e-mail: baldoni @di.unito.it - URL: http://www.di.unito.it/~baldoni Ingegneria del Software: Programmazione ad Oggetti JAVA Input/Output InputStream public abstract int read() throws IOException public int read(byte[] buf) throws IOException public int read(byte[] buf, int off, int len) throws IOException public long skip(long count) throws IOException public int available() throws IOException • Le classi sono definite nel package java.io che deve essere importato esplicitamente • Java distingue tra stream per input, per output e per input/output • Gerarchia di classi InputStream • Gerarchia di classi OutputStream • In Java la classe File descrive le caratteristiche di un file (nome, lunghezza, permessi di accesso, etc.) e non le operazioni di lettura/scrittura Ingegneria del Software: Programmazione ad Oggetti 2 public void close() throws IOException 3 OutputStream class CountSpace { public static void main(String args[]) throws IOException { InputStream in = (args.length == 0) ? System.in : new FileInputStream(args [0]); int ch, total, spaces = 0; for (total=0; ((ch = in.read()) != -1); total++) if (Character.isSpace((char) ch)) spaces++; System.out.println(total+ ” chars, “+spaces+” spaces”); } } Ingegneria del Software: Programmazione ad Oggetti 4 JAVA Input/Output public abstract void write(int b) throws IOException public void write(byte[] buf ) throws IOException public void write(byte[] buf , int off, int len) throws IOException public void flush() throws IOException public void close() throws IOException class Translate { public static void main(String args []) throws IOException { InputStream in = System.in; OutputStream out = System.out; String from = args[0], to = args[1]; int ch, i; while ((c h = in.read()) != -1) { if ((i = from.indexOf(c h)) != -1) out.write(to.charAt(i)); else out.write( ch); } public static void error(String err) { ... } Ingegneria del Software: Programmazione ad Oggetti } 5 • Non esiste un metodo open definito per InputStream e OutputStream • Un file è aperto automaticamente dal costruttore FileInputStream o FileOutputStream • InputStream e OutputStream sono classi astratte e non possono essere istanziate Ingegneria del Software: Programmazione ad Oggetti 6 1 JAVA Input/Output JAVA Input/Output import java.io.*; class WordCount { public static int words=0; public static int lines=0; public static int chars=0; public static void wc(InputStream f) throws IOException { int c=0; boolean lastNotWhite=false; String whiteSpace = " \t\n\r"; while ((c = f.read()) != -1) { chars++; if (c == '\n') { lines++; } if (whiteSpace.indexOf(c) != -1) { if (lastNotWhite) { words++; } lastNotWhite = false; } else { lastNotWhite = true; } } } Ingegneria del Software: Programmazione ad Oggetti public static void main(String args[]) { FileInputStream f; try { if (args.length == 0) { // We're working with stdin f = new FileInputStream(System.in); wc(f); } else { // We're working with a list of files for (int i=0; i < args.length; i++) { f = new FileInputStream(args [i]); wc(f); } } } catch (IOException e) { return; } System.out.println(lines + " " + words + " " + chars); } } 7 • In Java non esiste una funzione analoga alla scanf del C per l’input formattato • Java definisce una classe di oggetti chiamata StreamTokenizer che trasforma una InputStream in una sequenza di token (parole) • Il metodo nextToken() parsifica il prossimo token in input e ne restituisce il tipo public static void wc (InputStream f) throws IOException { int c=0; PushbackInputStream pbf = new PushbackInputStream(f); String whiteSpace = " \t\n\r"; while ((c = pbf.read()) != -1) { chars++; if (c == '\n') { lines++; } if (whiteSpace.indexOf(c) != -1) { c = pbf.read(); if ( whiteSpace. indexOf(c) != -1) { words++; } pbf.unread(c); } } } • TT_WORD : una parola • TT_NUMBER : un numero • TT_EOL : fine linea • TT_EOF : fine stream 9 JAVA Input/Output StreamTokenizer public static void wc(InputStream f) throws IOException { StreamTokenizer tok = new StreamTokenizer(f); tok.resetSyntax(); tok.wordChars (33, 255); tok.whitespaceChars (0, ' '); tok.eolIsSignificant(true); int tokenType = tok.nextToken(); while (tok.ttype != StreamTokenizer.TT_EOF) { switch (tokenType) { case StreamTokenizer.TT_EOL: lines++; chars++; break; case StreamTokenizer.TT_WORD: words++; default: // FALLSTHROUGH chars += tok.sval.length(); break; } tokenType = tok.nextToken(); } Ingegneria del Software: Programmazione ad Oggetti } 8 JAVA Input/Output StreamTokenizer JAVA Input/Output Ingegneria del Software: Programmazione ad Oggetti Ingegneria del Software: Programmazione ad Oggetti Ingegneria del Software: Programmazione ad Oggetti 10 PrintStream • Realizza l’output dei valori in formato caratteri stampabili • aggiunge metodi print e println per ogni tipo di dato standard • print e println richiamano un metodo toString per convertire il parametro in input in formato caratteri stampabili • per stampare un oggetto definito dall’utente basta ridefinire il metodo toString 11 Ingegneria del Software: Programmazione ad Oggetti 12 2 PrintStream class Entry { String name; String address; String phone; ... public String toString () { return(name+ ” “+address+” “+phone); } } class test { public static void main(String args[]) { PrintStream out = System.out; Entry[] addressBook = new Entry[10]; ... int i; for (i=0; i< addressBook .length; i++) out.println(addressBook[i]); } } Ingegneria del Software: Programmazione ad Oggetti 13 3