JavaRush /Blog Java /Random-FR /A quoi sert la classe PrintStream ?

A quoi sert la classe PrintStream ?

Publié dans le groupe Random-FR
Bonjour! Aujourd'hui, nous allons parler de la classe PrintStreamet de tout ce qu'elle peut faire. A quoi sert la classe PrintStream - 1En fait, vous connaissez déjà deux méthodes de la classe PrintStream. Ce sont les méthodes print()et println()que vous utilisez probablement tous les jours :) Puisqu'une variable System.outest un objet PrintStream, lorsque vous appelez une méthode System.out.println(), vous appelez une méthode de cette classe particulière. L'objectif général de la classe PrintStreamest de générer des informations dans un flux. Cette classe a plusieurs constructeurs. Voici quelques-uns des plus courants :
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Comme vous pouvez le voir, nous pouvons transmettre au constructeur de l'objet PrintStream, par exemple, le nom du fichier dans lequel nous voulons sortir les données. Ou bien l’objet lui-même File. Voyons comment cela fonctionne avec des exemples :
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);
   }
}
Ce code créera un fichier sur le bureau test.txt(s'il n'y existe pas déjà) et y écrira notre numéro, notre chaîne et booleannotre variable de manière séquentielle. Voici le contenu de notre fichier après l'exécution du programme :

222
Hello world!
false
Comme nous l'avons dit plus haut, il n'est pas nécessaire de transmettre l'objet fichier lui-même File. Il vous suffit de spécifier le chemin d'accès dans le constructeur :
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);
   }
}
Ce code fera la même chose que le précédent. Une autre méthode intéressante à examiner est printf()la sortie de chaîne formatée. Que signifie « chaîne formatée » ? Pour expliquer, je vais donner un exemple :
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();

   }
}
Ici, au lieu d'écrire explicitement le nom et l'âge de notre robot sur une ligne, nous semblons laisser un « espace libre » pour ces informations à l'aide de pointeurs %set %d. Et nous transmettons les données qui devraient se trouver à ces endroits comme paramètres. Dans notre cas, il s'agit de la chaîne " Amigo " et du nombre 18. On pourrait par exemple créer un autre espace : disons, %b, et passer un autre paramètre. Pourquoi est-ce? Tout d’abord, pour accroître la flexibilité. Si votre programme doit afficher fréquemment un message de bienvenue, vous devrez saisir manuellement le texte requis pour chaque nouveau robot. Vous ne pourrez même pas mettre ce texte dans une constante : les noms et les âges de chacun sont différents ! Mais en utilisant la nouvelle méthode, vous pouvez générer une chaîne avec un message d'accueil en une constante et, si nécessaire, modifier simplement les paramètres de la méthode 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();
   }
}

Usurpation de System.in

Dans cette conférence, nous allons « combattre le système » et apprendre à remplacer une variable System.inet à rediriger la sortie du système vers l'endroit dont nous avons besoin. A quoi sert la classe PrintStream - 2Vous avez peut-être oublié de quoi il s'agit System.in, mais aucun étudiant JavaRush n'oubliera jamais cette construction :
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(like System.out) est une variable de classe statique System. Mais contrairement à System.out, il appartient à une classe différente, à savoir à InputStream. Par défaut System.in, il s'agit d'un thread qui lit les données du périphérique système : le clavier. Cependant, comme dans le cas de System.out, nous pouvons remplacer la source de données, et la lecture ne se fera pas depuis le clavier, mais depuis l'endroit dont nous avons besoin ! Regardons un exemple :
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);
       }

   }
}
Alors qu'est ce qu'on a fait? Généralement System.in« lié » au clavier. Mais nous ne voulons pas que les données soient lues à partir du clavier : qu’elles soient lues à partir d’une ligne de texte normale ! Nous avons créé une chaîne et l'avons reçue sous forme de tableau d'octets. Pourquoi avons-nous besoin d’octets ? Le fait est qu’il InputStreams’agit d’une classe abstraite et que nous ne pouvons pas en créer une instance. Vous devrez choisir une classe parmi ses héritiers. Par exemple, nous pouvons prendre ByteArrayInputStream. C'est simple, et rien que par son nom, son fonctionnement est clair : sa source de données est un tableau d'octets. Nous créons donc ce même tableau d'octets et le transmettons à notre constructeur stream, qui lira les données. En fait, tout est déjà prêt ! Il ne nous reste plus qu'à utiliser la méthode System.setIn()pour définir explicitement la valeur de la variable in. Dans le cas de out, comme vous vous en souvenez, il était clairement impossible non plus de définir la valeur de la variable : il fallait utiliser une méthode spéciale setOut(). Après avoir attribué InputStreamla variable que nous avons créée System.in, nous devons vérifier si notre idée a fonctionné. Un vieil ami nous aidera avec ça BufferedReader. Dans une situation normale, ce code entraînerait l'ouverture d'une console dans votre Intellij IDEa, et les données que vous avez saisies à partir du clavier seraient lues à partir de là.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

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

           System.out.println(str);
       }
Mais lorsque vous l'exécuterez maintenant, vous verrez que notre texte du programme sera simplement affiché sur la console, il n'y aura pas de lecture depuis le clavier. Nous avons changé la source de données, maintenant ce n'est plus le clavier, mais notre chaîne ! C'est tellement simple et facile :) Dans la conférence d'aujourd'hui, nous avons fait connaissance avec un nouveau cours et examiné un nouveau petit « hack » pour travailler avec les E/S. Il est temps de reprendre le cours et de résoudre quelques problèmes :) Rendez-vous lors de la prochaine conférence !
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION