JavaRush /Java Blog /Random-IT /A cosa serve la classe PrintStream?

A cosa serve la classe PrintStream?

Pubblicato nel gruppo Random-IT
Ciao! Oggi parleremo della classe PrintStreame di tutto ciò che può fare. A cosa serve la classe PrintStream? - 1In realtà, hai già familiarità con due metodi della classe PrintStream. Questi sono i metodi print()e println()che probabilmente usi ogni giorno :) Poiché una variabile System.outè un oggetto PrintStream, quando chiami un metodo System.out.println(), stai chiamando un metodo di questa particolare classe. Lo scopo generale della classe PrintStreamè inviare informazioni a un flusso. Questa classe ha diversi costruttori. Ecco alcuni dei più comuni:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Come puoi vedere, possiamo passare al costruttore dell'oggetto PrintStream, ad esempio, il nome del file in cui vogliamo inviare i dati. O, in alternativa, l'oggetto stesso File. Vediamo come funziona con degli esempi:
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 sul desktop test.txt(se non esiste già lì) e scriverà lì il nostro numero, stringa e booleanvariabile in sequenza. Ecco il contenuto del nostro file dopo l'esecuzione del programma:

222
Hello world!
false
Come abbiamo detto sopra, non è necessario passare l'oggetto file stesso File. Devi solo specificarne il percorso nel 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 farà lo stesso del precedente. Un altro metodo interessante da considerare è , printf()o output di stringa formattata. Cosa significa "stringa formattata"? Per spiegarmi 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\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("I'm robot!");

       printStream.printf("My name is %s, my age is %d!", "Amigo", 18);

       printStream.close();

   }
}
Qui, invece di scrivere esplicitamente in una riga il nome e l'età del nostro robot, sembriamo lasciare "spazio libero" per queste informazioni utilizzando puntatori %se %d. E passiamo i dati che dovrebbero trovarsi in questi luoghi come parametri. Nel nostro caso, questa è la stringa " Amigo " e il numero 18. Potremmo, ad esempio, creare un altro spazio: diciamo, %b, e passare un altro parametro. Cosa serve? Innanzitutto per aumentare la flessibilità. Se il tuo programma ha bisogno di visualizzare frequentemente un messaggio di benvenuto, dovrai inserire manualmente il testo richiesto per ogni nuovo robot. Non potrai nemmeno inserire questo testo in una costante: i nomi e le età di ognuno sono diversi! Ma usando il nuovo metodo, puoi generare una stringa con un saluto a una costante e, se necessario, modificare semplicemente i parametri nel metodo printf().
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   private static final String GREETINGS_MESSAGE = "My name is %s, my age is %d!";

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

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\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();
   }
}

System.in spoofing

In questa lezione "combatteremo il sistema" e impareremo come sostituire una variabile System.ine reindirizzare l'output del sistema nel punto di cui abbiamo bisogno. A cosa serve la classe PrintStream? - 2Potresti aver dimenticato di cosa si tratta System.in, ma nessuno studente JavaRush dimenticherà mai questa costruzione:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(like System.out) è una variabile di classe statica System. Ma, a differenza di System.out, appartiene a una classe diversa, vale a dire a InputStream. Per impostazione predefinita System.in, questo è un thread che legge i dati dal dispositivo di sistema: la tastiera. Tuttavia, come nel caso di System.out, possiamo sostituire la fonte dei dati e la lettura non avverrà dalla tastiera, ma dalla posizione di cui abbiamo bisogno! Diamo un'occhiata ad un esempio:
import java.io.*;

public class Main {

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

       String greetings = "Hello! Меня зовут Амиго!\nЯ изучаю Java на сайте JavaRush.\nОднажды я стану крутым программистом!\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);
       }

   }
}
Allora cosa abbiamo fatto? Solitamente System.in“legato” alla tastiera. Ma non vogliamo che i dati vengano letti dalla tastiera: lasciamo che vengano letti da una normale riga di testo! Abbiamo creato una stringa e l'abbiamo ricevuta come array di byte. Perché abbiamo bisogno di byte? Il fatto è che InputStreamè una classe astratta e non possiamo crearne un'istanza. Dovrai scegliere una classe tra i suoi eredi. Ad esempio, possiamo prendere ByteArrayInputStream. È semplice e già dal nome è chiaro come funziona: la sua origine dati è un array di byte. Quindi creiamo lo stesso array di byte e lo passiamo al nostro costruttore stream, che leggerà i dati. In effetti è già tutto pronto! Ora dobbiamo solo utilizzare il metodo System.setIn()per impostare esplicitamente il valore della variabile in. Nel caso di out, come ricorderete, era chiaramente impossibile nemmeno impostare il valore della variabile: era necessario utilizzare un metodo speciale setOut(). Dopo aver assegnato InputStreamla variabile che abbiamo creato System.in, dobbiamo verificare se la nostra idea ha funzionato. Un vecchio amico ci aiuterà in questo BufferedReader. In una situazione normale, questo codice causerebbe l'apertura di una console nel tuo Intellij IDEa e i dati immessi dalla tastiera verrebbero letti da lì.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }
Ma quando lo esegui ora, vedrai che il nostro testo dal programma verrà semplicemente inviato alla console, non ci sarà alcuna lettura dalla tastiera. Abbiamo cambiato la sorgente dati, ora non è la tastiera, ma la nostra stringa! È così facile e semplice :) Nella lezione di oggi abbiamo conosciuto una nuova classe e abbiamo esaminato un nuovo piccolo "hack" per lavorare con l'I/O. È ora di tornare al corso e risolvere alcuni problemi :) Ci vediamo alla prossima lezione!
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION