Informatica I
Ingegneria Medica
Prof. Diego Salamon
Gestione I/O
Prof. Diego Salamon
Introduzione
Nella creazione e gestione del software è
necessario interagire con entità esterne a
quelle del programma che andiamo a
implementare.
„ E’ necessario cioè creare dei canali di
comunicazione che permettano agli
algoritmi implementati di scambiare
informazioni con l’utente e di restituire
risultati
„
Leggere dati in ingresso
„
Mentre la stampa di stringhe (output
verso il monitor) è agevole tramite il
metodo
…
„
1.
2.
3.
System.out.println(…);
L’input da tastiera necessita di qualche
operazioni aggiuntiva:
Importiamo la classe Scanner
Istanziamo un oggetto di questa classe
Utilizziamo i metodi che la classe mette a
disposizione
La classe Scanner
„ Permette la lettura dei dati da tastiera
„ E’ presente dalla versione 5 di Java
„ Importo la classe:
… import
„
java.util.Scanner
Istanzio l’oggetto:
… Scanner
in = new Scanner (System.in);
In dipendenza del dato in ingresso la classe
mette a disposizione i seguenti metodi:
nextInt();// per ricevere in ingresso degli interi
nextDouble(); // per ricevere in ingresso dei double
nextLine(); // per ricevere in ingresso delle stringhe
„ Il programma sa che l’immissione da tastiera è
terminata dopo la pressione del tasto enter
„
Esempio
import java.util.Scanner
Public class tester{
public class void main(String [] args)
{
Scanner in = new Scanner(System.in);
System.out.println(“Inserisci un valore:”);
int quantity = in.nextInt();
}
}
Generalizzazioni
Le istanze della classe scanner possono
essere diverse; nel caso di input da
tastiera istanzio un oggetto di questa
classe passando al costruttore come
parametro l’oggetto System.in. Questo mi
permette di utilizzare la classe per l’input
da tastiera
„ La stessa classe Scanner la posso
utilizzare per gestiore I/O su file passando
al costruttore un altro oggetto come
parametro
„
File e Flussi
Una delle attività più utili e frequenti nella
programmazione è l’interazione tra i
programmi e i file.
„ I file possono essere organizzati in diversi
modi.
„
… File
di testo (come i sorgenti java)
… File binari (serializzati, o non)
Gli oggetti coinvolti
Anche in questo caso usiamo la classe
scanner, istanziato con l’oggetto
FileReader.
„ L’oggetto FileReader si aspetta come
parametro costruttore il nome del file
presente sul file system per la lettura e/o
la scrittura
„
FileReader reader = new FileReader(“input.txt”);
Scanner in = new Scanner(reader);
Lettura da File
„
Istanziati gli oggetti reader e in possiamo
utilizzare i metodi già visti per l’input da
tastiera per leggere dal file(next, nextLine,
nextInt, nextDouble)
import java.util.Scanner
Import java.io.FileReader
Public class tester{
public class void main(String [] args)
{
FileReader reader= new FileReader(“input.txt”);
Scanner in = new Scanner(reader);
System.out.println(“Inserisci un valore:”);
int quantity = in.nextInt();
}
}
Scrittura su File
„
„
„
La scrittura su file utilizza una classe
ancora diversa, PrintWriter
PrintWriter out = new PrintWriter(“output.txt”)
Se il file su cui scrivere esiste già viene svuotato
prima di scrivervi nuovi dati, se non esiste viene
creato.
I metodi da utlizzare per scrivere su file sono:
… out.println(“…”);
… out.print(“…”);
„
Ogni flusso dati in scrittura utilizzante l’oggetto
PrintWriter deve essere chiuso:
… out.close
Esempio
01: import java.io.FileReader;
02: import java.io.PrintWriter;
03: import java.util.Scanner;
04:
05: public class LineNumberer
06: {
07: public static void main(String[] args)
08: {
09:
Scanner console = new Scanner(System.in);
10:
System.out.print("Input file: ");
11:
String inputFileName = console.next();
12:
System.out.print("Output file: ");
13:
String outputFileName = console.next();
14:
//
SEGUE
Esempio
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
FileReader reader = new FileReader(inputFileName);
Scanner in = new Scanner(reader);
PrintWriter out = newPrintWriter(outputFileName);
int lineNumber = 1;
while (in.hasNextLine())
{
String line = in.nextLine();
out.println("/* " + lineNumber + " */ " + line);
lineNumber++;
}
out.close();
}
File e Formati
„
Esistono due modi fondamentali per
memorizzare i dati:
… Modo
tipo Testo
… Modo di tipo Binario
Nel formato testo i dati sono memorizzati e
rappresentati in forma leggibile, come
sequenze di caratteri
„ Nel formato binario i dati sono
rappresentati da sequenze di byte
„
File di Tipo Binario
Se si utilizza la modalità binaria le classi
viste vanno sostituite con le rispettive che
gestiscono gli stream di dati:
„ FileInputStream
„ FileOutputStream
„
FileInputStream inputstream=new FileInputStream(“input.bin”);
FileOutputStream outputstream=new FileOutputStream(“output.bin”);
La classe InputStream ha un metodo read per leggere un byte per volta
Analogamente la classe OutputStream ha un metodo per scrivere un
byte per volta.
int next inpustream.read();
Per verificare la fine del flusso occorre controllare che next != -1
Esempio
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Tester
{
public void TestFile(String inFile, String outFile)
{
FileInputStream in = null;
FileOutputStream out = null;
in = new FileInputStream(inFile);
out = new FileOutputStream(outFile);
TesterStream (in,out);
}
Esempio
public void TesterStream(FileInputStream in, FileOutputStream out)
{
boolean done = false;
while (!done)
{
int next = in.read();
if (next == -1) done = true;
else
{
byte b = (byte) next;
out.write(b);
}
}
}
Esempio
import java.util.Scanner;
public class EncryptorTester
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.print("Input file: ");
String inFile = in.next();
System.out.print("Output file: ");
String outFile = in.next();
Tester prova= new Tester();
prova.TestFile(inFile, OutFile);
}
}
Accesso Casuale e Sequenziale
„
Sequential access
… Un
file è acceduto un byte per volta
… Può essere un modo di procedere inefficiente
„
Random access
… Permette
l’accesso a posizioni arbitrarie del file
… Solo I file permettono l’accesso casuale
„
System.in e System.out non possono
… Per
ogni file aperto esiste uno speciale puntatore
della posizione corrente del file
„
„
E’ possibile leggere o scrivere dalla posizione corrente del
puntatore.
Gli esempi visti sino ad ora erano
implementazioni di accessi sequenziali
Accesso Casule e sequenziale
File ad Accesso Casuale
Java per permettere l’accesso casuale
mette a disposizione un classe
RandomAccessFile
Import java.io.RandomAccessFile;
„ Per aprire un file ad accesso casuale
dobbiamo fornire un nome al file e indicare
la modalità di apertura:
„
…
“r” o “rw”
RandomAccessFile f = new RandomAccessFile(“prova.dat","rw");
File ad Accesso Casuale
„
L’invocazione del metodo
… f.seek();
… Sposta
il puntaotore al byte di indice n contando le
posizioni dall’inizio del file per sapere quale è la
posizione corrente del puntatore del file esiste il
metodo:
… f.getFilePointer();
… Per sapere quanto è lungo un file si usa il metodo
length
… f.length
„
La classe RandomAccessFile memorizza i dati
in formato binario
File ad Accesso Casuale
„
La classe RandomAccessFile mette a
disposizione i metodi:
… readInt
e writeInt o readDouble e writeDouble
per leggere e/o scrivere su file
double x = f.readDouble();
f.writeDouble(x);