Output in Java

In Java l'istruzione per comunicare un messaggio o un risultato sullo standard output (solitamente la console di windows) è la seguente:

// visualizzazione di un messaggio statico
// Essi vanno racchiusi tra virgolette doppie
System.out.print("Ciao mondo!");

// visualizzazione del valore contenuto in una variabile
System.out.print(variabile);

Notare l'uso delle virgolette per delimitare del testo statico, che deve essere stampato esattamente come scritto.
I nomi delle variabili, di cui si vuole stampare il valore, non vanno racchiusi tra virgolette.

Queste istruzioni stampano il messaggio o il valore della variabile indicata e lasciano il cursore al termine dell'informazione stampata. Questo vuol dire che eventuali successivi comandi di stampa continueranno accodando a quanto precedentemente stampato.
Se, invece, si vuole inserire un ritorno di riga alla fine di quanto stampato, in modo che eventuali comandi di stampa successivi agiscano su una nuova riga, occorre utilizzare i comandi che seguono:

System.out.println("Ciao mondo!");

System.out.println(variabile);

Più in generale, le istruzioni print/println richiedono una informazione trasformabile in testo che può anche essere ottenuto attraverso la valutazione di una espressione più articolata. Nell'esempio che segue si costruisce un messaggio da visualizzare concatenando del testo statico al valore contenuto un una variabile di tipo stringa.

System.out.println("Ciao mondo da " + nome);

Se il contenuto della variabile nome fosse, ad esempio, Mario, il risultato del comando precedente produrrebbe in uscita il messaggio "Ciao mondo da Mario".
Notare lo spazio prima delle virgolette chiuse per separare il testo dal valore contenuto nella variabile nome.

Input in Java

Ci sono diverse modalità per permettere all'utente l'introduzione di informazioni attraverso lo standard input.
Ne analizziamo un paio, in particolare l'uso della classe Scanner o, in alternativa, delle classi InputStreamReader e BufferedReader, in combinazione.
Entrambi richiedono la definizione e creazione degli oggetti necessari, da fare una sola volta, possibilmente nella sezione di dichiarazione variabili, come mostrato negli esempi che seguono.
Ovviamente l'indicazione sul posizionamento di tali istruzioni è un suggerimento. Esso può essere sensato nella maggior parte dei casi, tuttavia, in situazioni in cui l'input sarà richiesto solo al verificarsi di determinate condizioni, tali istruzioni possono anche essere posizionate in altri punti specifici del nostro codice.

La classe Scanner è di più recente introduzione rispetto alle classi InputStreamReader/BufferedReader e, pertanto, dispone di funzionalità per eseguire alcuni compiti in modo più agevole.
Vediamo, nell'esempio di codice che segue, come essa si utilizza.

package primoprogrammaconinput;

// istruzioni di collegamento alla libreria che definisce 
// le classi che vogliamo usare
import java.util.Scanner;

public class PrimoProgrammaConInput {
    
    // dichiarazione degli oggetti necessari ad acquisire input
    // tali oggetti possono essere definiti in questa sezione
    // destinata alla dichiarazione delle variabili globali
    // oppure, come alternativa, all'interno del main, nella 
    // sezione destinata alle variabili locali
    Scanner tastiera=new Scanner(System.in);

    public static void main(String[] args) {

        // come già specificato sopra, in alternativa, gli oggetti necessari 
        // per effettuare l'input dei dati possono essere dichiarati in questa
        // sezione, destinata alla dichiarazione delle variabili locali al main
        Scanner tastiera=new Scanner(System.in);
        
        
        // ora posso utilizzare l'istruzione che segue per acquisire 
        // input in formato stringa (alfanumerico) dall'utente
        System.out.print("Inserisci il tuo nome: ");
        String nome=tastiera.nextLine();


        // se si volesse invece acquisire dei valori numerici
        // occorre invece utilizzare le istruzioni che seguono

        // Acquisizione di un numero intero
        // l'input è restituito direttamente come numero intero
        // non è necessaria nessuna azione di trasformazione
        System.out.print("Inserisci un numero intero: ");
        int numIntero = tastiera.nextInt();

        // Acquisizione di un numero decimale float
        // l'input è restituito direttamente come numero decimale
        // non è necessaria nessuna azione di trasformazione
        System.out.print("Inserisci un numero decimale: ");
        float numDecimale = tastiera.nextFloat();

        // Acquisizione di un numero decimale double
        // l'input è restituito direttamente come numero decimale
        // non è necessaria nessuna azione di trasformazione
        System.out.print("Inserisci un numero decimale: ");
        double numDecimale = tastiera.nextDouble();
    }
}

Vediamo ora, in alternativa, nell'esempio di codice che segue, le istruzioni da utilizzare per acquisire input dall'utente attraverso le classi InputStreamReader/BufferedReader.

package primoprogrammaconinput;

// istruzioni di collegamento alla libreria che definisce 
// le classi che vogliamo usare
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class PrimoProgrammaConInput {
    
    // dichiarazione degli oggetti necessari ad acquisire input
    // tali oggetti possono essere definiti in questa sezione
    // destinata alla dichiarazione delle variabili globali
    // oppure, come alternativa, all'interno del main, nella 
    // sezione destinata alle variabili locali
    InputStreamReader input=new InputStreamReader(System.in);
    BufferedReader tastiera = new BufferedReader(input);

    // notare l'uso di throws Exception per aggirare un errore segnalato 
    // dall'utilizzo delle classi InputStreamReader e BufferedReader
    // Si tratta di una tecnica che utilizziamo al momento per aggirare 
    // l'ostacolo, in quanto non conosciamo ancora gli strumenti da utilizzare
    // per indirizzare correttamente questi tipi di errore.
    // Tale tecnica non è assolutamente corretta ed è da intendersi solo
    // ed esclusivamente come soluzione temporanea
    public static void main(String[] args) throws Exception {

        // come già specificato sopra, in alternativa, gli oggetti necessari 
        // per effettuare l'input dei dati possono essere dichiarati in questa
        // sezione, destinata alla dichiarazione delle variabili locali al main
        InputStreamReader input=new InputStreamReader(System.in);
        BufferedReader tastiera = new BufferedReader(input);
        
        
        // ora posso utilizzare l'istruzione che segue per acquisire 
        // input in formato stringa (alfanumerico) dall'utente
        System.out.print("Inserisci il tuo nome: ");
        String nome=tastiera.readLine();


        // se si volesse invece acquisire dei valori numerici
        // è necessario convertire la stringa inserita dall'utente 
        // nel valore numerico opportuno

        // Acquisizione di un numero intero
        // Si possono utilizzare, in alternativa, le due istruzioni che seguono
        // per trasformare l'input alfanumerico in un numero intero
        System.out.print("Inserisci un numero intero: ");
        int numIntero = Integer.parseInt(tastiera.readLine);
        int numIntero = (int)tastiera.readLine();

        // Acquisizione di un numero decimale float
        // Si possono utilizzare, in alternativa, le due istruzioni che seguono
        // per trasformare l'input alfanumerico in un numero decimale
        System.out.print("Inserisci un numero decimale: ");
        float numDecimale = Float.parseFloat(tastiera.readLine);
        float numDecimale = (float)tastiera.readLine();

        // Acquisizione di un numero decimale double
        // Si possono utilizzare, in alternativa, le due istruzioni che seguono
        // per trasformare l'input alfanumerico in un numero decimale
        System.out.print("Inserisci un numero decimale: ");
        double numDecimale = Double.parseDouble(tastiera.readLine);
        double numDecimale = (double)tastiera.readLine();
    }
}