22
1 Laboratorio di Programmazione - Luca Tesei Input Il tipo char Alcune modalità di acquisizione di input

Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

Embed Size (px)

Citation preview

Page 1: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

1Laboratorio di Programmazione - Luca Tesei

Input

Il tipo charAlcune modalità di acquisizione di input

Page 2: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

2Laboratorio di Programmazione - Luca Tesei

Lettura di dati in input

• Vediamo due modi per acquisire dei dati di input dall’utente:

1. Tramite una finestra grafica di dialogo2. Tramite lo standard input (la console, ma in

generale può essere un qualunque file)

– I dati in input rendono il programma interattivo e possono fare in modo che il comportamento dello stesso programma sia diverso se vengono dati input diversi

Page 3: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

3Laboratorio di Programmazione - Luca Tesei

Finestra di dialogo

● Possiamo chiedere all’utente di inserire una stringa e possiamo trattare l’oggetto corrispondente nel nostro programma

● La classe che ci serve per far apparire la finestra è javax.swing.JOptionPane (consultare API)

● Questa classe ha diversi metodi static showInputDialog che restituiscono un oggetto String

● Per far apparire la finestra e ottenere l’input: String input = JOptionPane.showInputDialog(

“Quanti nickel hai?”);

Page 4: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

4Laboratorio di Programmazione - Luca Tesei

Finestra di dialogo

● La stringa che passiamo come parametro sarà visualizzata sulla finestra

Page 5: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

5Laboratorio di Programmazione - Luca Tesei

Finestra di dialogo

● L’utente è libero di digitare qualunque cosa nel campo di input

● Poi potrà fare click sui pulsanti OK o Annulla● Se l’utente fa click su Annulla viene restituito il

valore null e la variabile String input varrà quindi null

● Se l’utente fa click su OK viene creato un oggetto String che contiene la stringa inserita e il suo riferimento viene assegnato alla variabile input

Page 6: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

6Laboratorio di Programmazione - Luca Tesei

Esempio di uso

import javax.swing.JOptionPane;

public class InputTest { public static void main(String argv[]) { String input = JOptionPane.showInputDialog( "Quanti nickel hai?"); // Utilizzo il metodo parseInt per ottenere // il numero intero digitato int nickels = Integer.parseInt(input); System.out.println(nickels); // Nei programmi che usano la grafica si deve usare // questa chiamata per terminare il programma System.exit(0); }}

Page 7: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

7Laboratorio di Programmazione - Luca Tesei

Esempio

● Naturalmente si dovrebbe gestire sia il caso in cui l’utente fa click su Annulla sia il caso in cui quello che digita non è un intero

● Ancora non abbiamo gli strumenti per farlo● Per adesso ci accontentiamo di un programma che, se

qualcosa va storto, termina con errore● Ricordarsi sempre di inserire System.exit(0);

come ultima istruzione del main, altrimenti il programma resta in esecuzione (il gestore della grafica rappresenta un processo della nostra applicazione che rimane attivo fino a quando non lo si chiude esplicitamente con il metodo static System.exit)

Page 8: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

8Laboratorio di Programmazione - Luca Tesei

Il tipo base char

● Il tipo base char rappresenta i caratteri

● Come sappiamo Java gestisce tutto il set di caratteri Unicode

● Per indicare un carattere basta inserirlo tra due apici singoli: ‘a’

● Ogni sequenza di escape corrisponde a un carattere ‘\n’, ‘\t’, ‘\u009F’

● Un carattere ha associato un valore numerico reperibile con Character.getNumericValue

Page 9: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

9Laboratorio di Programmazione - Luca Tesei

Caratteri e Stringhe

● ‘h’ è un char ● “h” è una stringa, quindi un oggetto dello Heap,

che contiene un solo carattere ‘h’● “Pippo”.charAt(0) ritorna il carattere ‘P’● Nelle stringhe i caratteri sono numerati da 0 in

su● “Pippo”.length() ritorna 5, la lunghezza della

stringa● Consultare le API

Page 10: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

10Laboratorio di Programmazione - Luca Tesei

Input da console

● Oltre che da una finestra di dialogo l’input può essere prelevato da uno stream di ingresso

● In Java, così come in C e in altri linguaggi, esiste uno stream apposito per questo che viene chiamato standard input

● Conosciamo già System.out, che è lo standard output, e sappiamo che è un oggetto della classe java.io.PrintStream

• System.in è un oggetto della classe java.io.InputStream ed è lo standard input

Page 11: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

11Laboratorio di Programmazione - Luca Tesei

Ottenere l’input

● Un oggetto della classe InputStream, quale è System.in, è in grado di leggere un byte per volta dallo stream che rappresenta

● Non è molto comodo● Quello che vorremmo è poter ottenere, come

con la finestra di dialogo, una stringa di input● Per prima cosa bisogna incapsulare l’oggetto System.in, di tipo InputStream, in un oggetto della classe java.io.InputStreamReader

Page 12: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

12Laboratorio di Programmazione - Luca Tesei

Ottenere l’input

● Un oggetto della classe InputStreamReader interpreta i byte di un oggetto InputStream come caratteri (tipo base char di Java)

● È un passo avanti per arrivare al nostro obiettivo

● I costruttori di questi oggetti richiedono sempre come argomento un’oggetto della classe InputStream

● Possiamo quindi usare System.in

Page 13: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

13Laboratorio di Programmazione - Luca Tesei

Ottenere l’input

InputStreamReader reader = new InputStreamReader(System.in);

• reader può restituire l’input sotto forma di un carattere per volta (guardare le API e scoprire come mai il metodo read restituisce un int piuttosto che un char)

● Possiamo ottenere di meglio● Gli oggetti della classe java.io.BufferedReader possono restituire stringhe formate da caratteri di uno stream di caratteri

Page 14: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

14Laboratorio di Programmazione - Luca Tesei

Ottenere l’input

BufferedReader console = new BufferedReader(reader);

● Il costruttore richiede un oggetto della classe java.io.Reader, di cui InputStreamReader è una sottoclasse

● Possiamo quindi passare il nostro oggetto System.in, incapsulato nell’oggetto reader di tipo InputStreamReader, al costruttore e ottenere l’oggetto riferito da console

Page 15: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

15Laboratorio di Programmazione - Luca Tesei

Ottenere l’input

● Sugli oggetti della classe BufferedReader è possibile chiamare il metodo readLine() che restituisce una stringa contentente una linea di testo

● Questo è quello che volevamo ottenere

Page 16: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

16Laboratorio di Programmazione - Luca Tesei

Ottenere l’input

● Ricapitolando:

InputStreamReader reader = new InputStreamReader(System.in);

BufferedReader console = new BufferedReader(reader);

● Oppure

BufferedReader console = new BufferedReader(new InputStreamReader(System.in));

Page 17: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

17Laboratorio di Programmazione - Luca Tesei

Ottenere l’input

● A questo punto:String input = console.readLine();● Aspetta fino a quando l’utente non digita una

linea di testo e preme Invio● La linea scritta è contenuta nella stringa riferita

da input● A questo punto possiamo fare il parsing della

stringa con i metodi delle classi involucro se ci aspettiamo l’inserimento di un valore di un certo tipo (es Integer.parseInt)

Page 18: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

18Laboratorio di Programmazione - Luca Tesei

IOException

● Abbiamo già visto che il metodo Integer.parseInt può sollevare un’eccezione se la stringa passata non contiene le cifre di un intero

● Anche il metodo readLine della classe BufferedReader può sollevare un’eccezione se qualcosa va storto con il reperimento dell’input

● L’eccezione è del tipo IOException

● L’eccezione IOException è un’eccezione che deve essere gestita obbligatoriamente

● Nel caso non la si voglia gestire si deve esplicitare che il metodo che stiamo scrivendo la può sollevare

Page 19: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

19Laboratorio di Programmazione - Luca Tesei

Throws

● Nel nostro caso il metodo che chiama readLine è il main

● Siccome ancora non abbiamo visto come gestire l’eccezione dobbiamo esplicitamente dichiarare che non la gestiamo scrivendo

public static void main(String[] argv) throws IOException {

...

}

Page 20: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

20Laboratorio di Programmazione - Luca Tesei

Un programma di esempio

import java.io.*;

public class InputDaConsole {

public static void main(String argv[]) throws IOException {

BufferedReader console = new BufferedReader(new

InputStreamReader(System.in));

System.out.println("Quanti nickels hai?");

String input = console.readLine();

int nickels = Integer.parseInt(input);

System.out.println("Hai scritto " + nickels);

}

}

Page 21: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

21Laboratorio di Programmazione - Luca Tesei

Classe Scanner

● Dalla versione 1.5 della jdk è disponibile una classe java.util.Scanner

● Uno scanner permette di scorrere/controllare un flusso di caratteri o una stringa riconoscendo interi, float, double o stringhe che fanno match con una data espressione regolare

● Nella sua versione di default i separatori sono gli spazi bianchi

● Si vedano le API per maggiori dettagli

Page 22: Il tipo char Alcune modalità di acquisizione di input · java.io.InputStreamReader. Laboratorio di Programmazione - Luca Tesei 12 Ottenere l’input Un oggetto della classe InputStreamReader

22Laboratorio di Programmazione - Luca Tesei

Esercizio

● Realizzare un main che: ● crea un nuovo borsellino● richiede in input (usando Scanner e/o standard

input) il numero di nickels, dimes e quarters da inserire nel borsellino

● inserisce tali monete● stampa quanti dollari ci sono nel borsellino