9. Input dell’utente: la classe Scanner
Andrea Pastore 19/03/2020 0
I programmi che abbiamo visto finora non prevedono l’interazione da parte dell’utente, possono solo essere avviati. Questo è diverso dai programmi reali, che danno la possibilità all’utente di interagire. Cominciamo a vedere la forma più semplice di interazione dell’utente, con dei programmi che saranno in grado di prendere input da tastiera.
Per questo utilizzeremo la classe Scanner, una delle tante classi messe a disposzione da Java per degli scopi specifici. Nel caso della classe Scanner questa è stata creata per consentire a Java di prendere in input dati testuali o numerici. Facciamo un esempio: il codice qui sotto chiede all’utente di scrivere qualcosa con la tastiera e poi stamperà quello che l’utente ha scritto.
import java.util.Scanner;
public class HelloScanner {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Scrivi qualcosa");
String s = input.nextLine();
System.out.println("Hai scritto: "+s);
}
}
Notiamo che questo programma ha una nuova riga di codice:
import java.util.Scanner;
Quando vogliamo usare una classe messa a disposizione da Java dobbiamo importarla. Faremo la stessa cosa in seguito quando importeremo classi realizzate da noi. Continuiamo l’analisi del nostro programma: vediamo subito dopo una classe e poi un metodo main, che sono cose a noi note. Poi vediamo un’altra riga di codice nuova:
Scanner input = new Scanner(System.in);
con questa riga stiamo creando un oggetto di tipo Scanner. Questa cosa ci sarà più chiara in seguito, per ora prendiamolo come un passaggio necessario per prendere in input questi dati. Proseguendo la lettura del codice troviamo un altro comando a noi noto, quello che ordina a Java di stampare:
System.out.println("Scrivi qualcosa");
Seguito da :
String s = input.nextLine();
che consente a java di recuperare il testo inserito dall’utente. In sostanza Il programma chiede all’utente di scrivere qualcosa (con il comando precedente) e poi si mette in ascolto: resterà bloccato fino a quando l’utente non avrà scritto qualcosa e premuto invio.
La riga successiva che troviamo
System.out.println("Hai scritto: "+s);
stampa a video ciò che ha scritto l’utente.
Recuperare tipi di dati diversi da String
Per la maggior parte del tempo utilizzeremo lo scanner per recuperare stringhe, ma può capitarci di dover recuperare altri tipi di dati ad esempio numeri interi o decimali. In questo caso dovremmo usare il seguente codice:
int n = input.nextInt(); // recuperiamo un numero intero
double d = input.nextDouble(); // recuperiamo un numero decimale
Nota: questi metodi possono creare dei problemi se subito dopo aver recuperato una numero dobbiamo recuperare una stringa. Se si verifica questa esigenza dobbiamo recuperare una stringa e poi fare la conversione, come mostrato in seguito:
System.out.println("Scrivi un numero");
String s = input.nextLine();
int n = Integer.parseInt(n);
Potrebbero interessarti anche...
Andrea Pastore 19/03/2020
7. Buone abitudini: indentare il codice
L’indentazione del codice consiste nell’inserire alcuni spazi all’inizio di una riga, ed è usata per aiutare a capire la struttura del codice scritto. Se ad esempio dobbiamo scrivere un if, per indicare il codice da eseguire se la condizione è verificata è buona norma indentare questo codice. Facciamo un esempio, prendiamo questo codice non indentato:
Tutti i caratteri sono scritti uno sotto l’altro e il codice risulta più difficile da leggere. Questo è un codice di poche righe, ma cosa succederebbe se fosse più corposo? Ci costringerebbe a perdere più tempo a capire cosa fa. Vediamo ora un codice ordinato:
Basta una rapida occhiata per capire il codice dove si trova e cosa fa.
Le regole dell’indentazione
Dobbiamo indentare il codice delle strutture di controllo (if, switch, for e altri), dei metodi e infine delle classi.
Andrea Pastore 19/03/2020
1. Le origini di Java e le sue caratteristiche
Java è un linguaggio di programmazione ad oggetti tra i più comuni al mondo, utilizzato praticamente in tutti i tipi di dispositivi, dai computer ai telefoni, distributori automatici e molto altro. Fu creato da Sun Microsystem nel 1995 ed è poi passato ad Oracle quando quest’ultima ha acquisito Sun.
La macchina virtuale Java
Una caratteristica di Java è quella di girare su tutti i sistemi operativi, senza che il codice venga ricompilato come avviene in altri linguaggi. Questa possibilità ci è data dalla Java Virtual Machine, che si occupa di leggere il codice Java tradurlo nel linguaggio macchina del dispositivo dove si trova.
Organizzazione del codice
Il codice Java è organizzato in classi, che sono contenute in package. Per ora ci basti sapere che una classe è un file contenente codice Java, può richiamare altre classi per fare compiti specifici. Le classi a loro volta sono suddivise in metodi, che possono essere richiamati dalla stessa classe o da altre classi.
Un programma java può avere un numero variabile di classi che può essere anche molto elevato (si pensi per esempio a programmi come Eclipse). Un programma Java deve avere sempre una classe che viene chiamata quando il programma va in esecuzione. Questa classe è chiamata classe main, capiremo più avanti questo concetto.
Un package è una cartella che contiene le classi Java. I progetti java possono essere molto vasti, quindi è necessario ordinare le classi in modo da essere consultabili. Ad esempio supponiamo di avere un programma di una biblioteca, un package potrebbe contenere tutte le classi Java deputate al salvataggio dei dati e un altro potrebbe contenere tutte le classi deputate alla gestione dell’interfaccia grafica.
Commenti
I commenti sono delle stringhe di testo che vegono utilizzate per spiegare il codice che si sta scrivendo. Quando scriviamo un programma non è detto che lo utilizzeremo solo noi, può darsi che quel codice vada in mano ad un collega. È bene quindi commentarlo per far capire a chi legge il codice (anche a noi stessi, se lo rileggiamo dopo un po’ di tempo!) cosa abbiamo fatto.I commenti in java si fanno in due modi:
// commento su singola riga
/*
* commento su più righe
* lo utilizziamo quando dobbiamo spiegare qualcosa di più elaborato
*/
Andrea Pastore 19/03/2020
14. I file in Java
Java mette a disposizione diverse classi per operare con i file. La prima classe che vediamo è la classe File, che consente di prendere informazioni sul file che vogliamo utilizzare, ad esempio per sapere se il file esiste, se possiamo scrivere e molto altro ancora. Un oggetto file si inizializza cosi:
File f = new File("prova.txt");
in questo caso abbiamo usato solo il nome del file, significa che Java cercherà quel file nella cartella dove sta eseguendo. Se il file che desideriamo si trova in un altra cartella possiamo anche fornire un percorso assoluto, come in questo caso:
File f = new File("/nomecartella/sottocartella/prova.txt");
Nota: per utilizzare questa classe dobbiamo importarla scrivendo:
import java.io.File;
Metodi della classe file
Vediamo quali sono i principali metodi della classe File:
exists() | Restituisce true se il file esiste, false altrimenti |
createNewFile() | Crea il file. Bisogna gestire un’eccezione di tipo IOException che viene lanciata nel caso il file non possa essere creato |
canRead() | Restiuisce true se Java può leggere il file |
canWrite() | Restituisce true se Java può scrivere il file |
isHidden() | Restituisce true se il file è nascosto, false altrimenti |
isFile() | Restituisce true se il percorso indicato è effettivamente un file, false altrimenti |
isDirectory() | Restituisce true se il percorso è una cartella, false altrimenti |
length() | Restituisce la dimensione del file in byte (sigifica che per avere ad esempio i mb devi dividere il valore restituito da long per 1000000 |
getAbsolutePath() | Stampa il percorso completo del file es C:/cartella/cartella... ecc |
astModified(); | Restituisce la data dell'ultima modifica in millisecondi dal 1970 (vedi il file helloDate per convertirli in una data tradizionale) |
Scrivere su un file
Per scrivere su un file dobbiamo utilizzare la classe la classe FileOutputStream, il cui costruttore prende in input un oggetto di tipo file. La scrittura nel file avviene con il metodo write: questo metodo prende in input una sequenza di byte, quindi dobbiamo convertire la stringa in byte con un metodo apposito: getBytes().
Nota: la creazione dell'oggetto FileOutputStream deve essere gestita con il costrutto try / catch per gestre due tipi di eccezioni: FileNotFoundEsception (che può verificarsi se scriviamo un percorso di file errato) e IOException (che può verificarsi quando Java non riesce a scrivere nel file).
public static void main(String[] args) {
File f = new File("prova.txt");
FileOutputStream out = null; // lo inizializziamo a null perché va gestito nel try catch
try {
out = new FileOutputStream(f);
out.write("Ciao".getBytes());
System.out.println("Scrittura eseguita con successo!");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
La modalità append
Ci sono casi in cui il file contiene già delle informazioni e non vogliamo perderle. Possiamo usare la modalità append, che aggiunge il testo alla fine del file. Per usare questa modalità al momento della creazione dell’oggetto FileInputStream dobbiamo specificare un secondo parametro, che riguarda appunto se usare o meno la modalità append. La stringa:
out = new FileOutputStream(f);
diventa
out = new FileOutputStream(f,true);
Leggere da un file
come per FileOutputStream anche la classe FileInputStream ha bisogno di un oggetto di tipo file, e la creazione dell'oggetto FileInputStream deve essere gestita con il costrutto try / catch per gestre due tipi di eccezioni: la prima è FileNoTfoundEsception che può esere generata dal costruttore e la seconda è IOException generato dal metodo read che si occupa di leggere materialmetne il file.
public static void main(String[] args) {
File f = new File("prova.txt");
FileInputStream in = null;
try {
in = new FileInputStream(f);
/*
* scriviamo ora il codice per la lettura del file: il seguente ciclo while legge il
* codice carattere per carattere, si fermerà solo quando il metodo read nel while ha
* dato risultato -1, che indica appunto la fine del file
*/
int i = 0;
while((i= in.read()) != -1) {
// read restuisce dei numeri interi che noi dobbiamo convertire in formato char (ovvero il
// singolo carattere, per fare questo usiamo un cast
// (char) i; è un cast, ovvero convertiamo la variabile i ad un valore diverso.
// Nota: non è sempre possibile fare i cast
char c = (char) i;
System.out.print(c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Nota: i metodi che abbiamo visto consentono di leggere file semplici (txt, csv oppure formati definiti da noi). Per leggere formati più elaborati, come ad esempio i file Excel, dobbiamo usare librerie apposite.