CIAO! Oggi parleremo della classe Java PrintStream e di tutto ciò che può fare. In realtà, hai già familiarità con due metodi della classe PrintStream . Sono print() e println() , che probabilmente usi tutti i giorni :) Poiché la variabile System.out è un oggetto PrintStream , stai chiamando uno dei metodi di questa classe quando chiami System.out.println() . Lo scopo generale della classe PrintStream è inviare informazioni a un flusso. Questa classe ha diversi costruttori. Ecco alcuni dei più comunemente usati:
- PrintStream(OutputStream outputStream)
- PrintStream(File outputFile) genera FileNotFoundException
- PrintStream(String outputFileName) genera FileNotFoundException
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class Main {
public static void main(String arr[]) throws FileNotFoundException
{
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
filePrintStream.println(222);
filePrintStream.println("Hello world");
filePrintStream.println(false);
}
}
Questo codice creerà un file test.txt sul desktop (se non esiste già) e scriverà in sequenza il nostro numero, stringa e valore booleano. Ecco i contenuti del file dopo aver eseguito il programma:
222
Hello world!
false
Come abbiamo detto sopra, non devi passare un oggetto File . È sufficiente passare semplicemente il percorso del file al costruttore:
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class Main {
public static void main(String arr[]) throws FileNotFoundException
{
PrintStream filePrintStream = new PrintStream("C:\\Users\\Username\\Desktop\\test.txt");
filePrintStream.println(222);
filePrintStream.println("Hello world");
filePrintStream.println(false);
}
}
Questo codice funziona come il codice precedente. Un altro metodo interessante che merita la nostra attenzione è printf() , che produce un output basato su una stringa di formato. Cos'è una "stringa di formato"? Faccio un esempio:
import java.io.IOException;
import java.io.PrintStream;
public class Main {
public static void main(String[] args) throws IOException {
PrintStream printStream = new PrintStream("C:\\Users\\Steve\\Desktop\\test.txt");
printStream.println("Hello!");
printStream.println("I'm a robot!");
printStream.printf("My name is %s. I am %d!", "Amigo", 18);
printStream.close();
}
}
Qui, invece di dichiarare esplicitamente il nome e l'età del nostro robot nella stringa, inseriamo dei segnaposto per queste informazioni, rappresentate da %s e %d . E passiamo come argomenti i dati che li sostituiranno. Nel nostro caso, questa è la stringa " Amigo " e il numero 18. Potremmo creare un altro segnaposto, diciamo %b , e passare un altro argomento. perché ne abbiamo bisogno? Soprattutto, per una maggiore flessibilità. Se il tuo programma richiede di visualizzare spesso un messaggio di benvenuto, dovresti digitare manualmente il testo necessario per ogni nuovo robot. Non puoi nemmeno rendere questo testo una costante, dato che ognuno ha nomi ed età diversi! Ma usando questo nuovo metodo, puoi isolare il saluto in una costante e, se necessario, cambiare semplicemente gli argomenti passati al metodo printf() .
import java.io.IOException;
import java.io.PrintStream;
public class Main {
private static final String GREETINGS_MESSAGE = "My name is %s. I am %d!";
public static void main(String[] args) throws IOException {
PrintStream printStream = new PrintStream("C:\\Users\\Steve\\Desktop\\test.txt");
printStream.println("Hello!");
printStream.println("We are robots!");
printStream.printf(GREETINGS_MESSAGE, "Amigo", 18);
printStream.printf(GREETINGS_MESSAGE, "R2-D2", 35);
printStream.printf(GREETINGS_MESSAGE, "C-3PO", 35);
printStream.close();
}
}
Sostituzione di System.in
In questa lezione "combatteremo il sistema" e impareremo come sostituire la variabile System.in per reindirizzare l'output del sistema dove vogliamo. Potresti dimenticare cos'è System.in , ma nessuno studente di CodeGym dimenticherà mai questo costrutto:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in (proprio come System.out ) è una variabile statica della classe System . Ma a differenza di System.out , fa riferimento a un'altra classe, vale a dire InputStream . Per impostazione predefinita, System.in è un flusso che legge i dati da un dispositivo di sistema: la tastiera. Tuttavia, proprio come con System.out , possiamo sostituire la tastiera come origine dati. Possiamo leggere i dati ovunque vogliamo! Diamo un'occhiata a un esempio:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
String greetings = "Hi! My name is Amigo!\nI'm learning Java on the CodeGym website.\nOne day I will become a cool programmer!\n";
byte[] bytes = greetings.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
System.setIn(inputStream);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = reader.readLine())!= null) {
System.out.println(str);
}
}
}
Quindi cosa abbiamo fatto? System.in è solitamente associato alla tastiera. Ma non vogliamo leggere i dati dalla tastiera: facciamo leggere i dati da una normale stringa! Abbiamo creato una stringa e l'abbiamo ottenuta come array di byte. Perché abbiamo bisogno di byte? Il fatto è che InputStream è una classe astratta, quindi non possiamo crearne un'istanza direttamente. Dobbiamo scegliere uno dei suoi discendenti. Ad esempio, possiamo scegliere ByteArrayInputStream . È semplice e il suo nome da solo ci dice come funziona: la sua origine dati è un array di byte. Quindi creiamo un array di byte e lo passiamo al costruttore del nostro stream che leggerà i dati. E ora è tutto pronto! Ora dobbiamo solo usare System.setIn()metodo per impostare in modo esplicito il valore della variabile in . Senza out , come ricorderete, non era nemmeno possibile impostare direttamente il valore della variabile: dovevamo usare il metodo setOut() . Dopo aver assegnato il nostro InputStream alla variabile System.in , vogliamo verificare se abbiamo raggiunto il nostro scopo. Il nostro vecchio amico BufferedReader viene in nostro aiuto qui. Normalmente, questo codice avrebbe aperto la console in IntelliJ IDEA e quindi avrebbe letto i dati immessi dalla tastiera.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = reader.readLine())!= null) {
System.out.println(str);
}
Ma ora quando lo esegui, vedrai che la nostra stringa viene semplicemente visualizzata nella console. Non c'è lettura dalla tastiera. Abbiamo sostituito l'origine dati. Non è più la tastiera, ma la nostra corda! È così semplice :) Nella lezione di oggi, abbiamo conosciuto una nuova classe ed esplorato un piccolo nuovo trucco per lavorare con l'I/O. Ora è il momento di tornare al corso e completare alcuni compiti :) Ci vediamo nella prossima lezione!
GO TO FULL VERSION