CodeGym /Blog Java /Random-FR /Classe Java PrintStream
Auteur
Vasyl Malik
Senior Java Developer at CodeGym

Classe Java PrintStream

Publié dans le groupe Random-FR
Salut! Aujourd'hui, nous allons parler de la classe Java PrintStream et de tout ce qu'elle peut faire. En fait, vous connaissez déjà deux méthodes de la classe PrintStream . Ce sont print() et println() , que vous utilisez probablement tous les jours :) Comme la variable System.out est un objet PrintStream , vous appelez l'une des méthodes de cette classe lorsque vous appelez System.out.println() .  L'objectif général de la classe PrintStream est d'envoyer des informations à un flux. Pourquoi nous avons besoin de la classe PrintStream - 1Cette classe a plusieurs constructeurs. Voici quelques-uns des plus couramment utilisés :
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) lève FileNotFoundException
  • PrintStream(String outputFileName) lève FileNotFoundException
Par exemple, nous pouvons passer le nom du fichier de sortie au constructeur PrintStream . Alternativement, nous pouvons passer un objet File . Regardons quelques exemples pour voir comment cela fonctionne :

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 test.txt sur le bureau (s'il n'existe pas déjà) et y écrira séquentiellement notre nombre, notre chaîne et notre booléen. Voici le contenu du fichier après avoir exécuté le programme :

222 
Hello world!
false
Comme nous l'avons dit plus haut, vous n'avez pas besoin de passer un objet File . Il suffit de passer simplement le chemin du fichier au 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 fait la même chose que le code précédent. Une autre méthode intéressante qui mérite notre attention est printf() , qui produit une sortie basée sur une chaîne de format. Qu'est-ce qu'une "chaîne de format" ? Laissez-moi vous 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\\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(); 
   } 
}
Ici, au lieu d'indiquer explicitement le nom et l'âge de notre robot dans la chaîne, nous mettons des espaces réservés pour ces informations, représentées par %s et %d . Et on passe en arguments les données qui vont les remplacer. Dans notre cas, il s'agit de la chaîne " Amigo " et du nombre 18. Nous pourrions créer un autre espace réservé, disons %b , et passer un autre argument. Pourquoi avons nous besoin de ça? Surtout, pour plus de flexibilité. Si votre programme vous demande d'afficher souvent un message de bienvenue, vous devrez taper manuellement le texte nécessaire pour chaque nouveau robot. Vous ne pouvez même pas faire de ce texte une constante, puisque tout le monde a des noms et des âges différents ! Mais en utilisant cette nouvelle méthode, vous pouvez isoler le message d'accueil dans une constante et, si nécessaire, simplement modifier les arguments passés à 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. 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(); 
   } 
} 

Remplacement de System.in

Dans cette leçon, nous allons "combattre le système" et apprendre à remplacer la variable System.in afin de rediriger la sortie du système là où nous voulons. Vous pourriez oublier ce qu'est System.in , mais aucun étudiant de CodeGym n'oubliera jamais cette construction :

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in  (tout comme System.out ) est une variable statique de la classe System . Mais contrairement à System.out , il fait référence à une autre classe, à savoir InputStream . Par défaut, System.in est un flux qui lit les données d'un périphérique système, le clavier. Cependant, tout comme avec System.out , nous pouvons remplacer le clavier comme source de données. Nous pouvons lire des données d'où nous voulons ! Regardons un exemple :

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); 
       } 

   } 
}
Alors qu'est ce qu'on a fait? System.in est généralement lié au clavier. Mais nous ne voulons pas lire les données à partir du clavier : faisons en sorte que les données soient lues à partir d'une chaîne ordinaire ! Nous avons créé une chaîne et l'avons obtenue sous forme de tableau d'octets. Pourquoi avons-nous besoin d'octets ? Le fait est que InputStream est une classe abstraite, nous ne pouvons donc pas en créer une instance directement. Nous devons choisir l'un de ses descendants. Par exemple, nous pouvons choisir ByteArrayInputStream . C'est simple, et son nom seul nous dit comment ça marche : sa source de données est un tableau d'octets. Nous créons donc un tableau d'octets et le transmettons au constructeur de notre flux qui lira les données. Et maintenant tout est prêt ! Maintenant, nous avons juste besoin d'utiliser le System.setIn ()pour définir explicitement la valeur de la variable in . Sans out , vous vous en souviendrez, il n'était pas non plus possible de définir directement la valeur de la variable : nous devions utiliser la méthode setOut() . Après avoir assigné notre InputStream à la variable System.in , nous voulons vérifier si nous avons atteint notre objectif. Notre vieil ami BufferedReader vient ici à notre secours. Normalement, ce code aurait ouvert la console dans IntelliJ IDEA, puis lu les données que vous avez saisies à partir du clavier.

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

       String str; 

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

           System.out.println(str); 
       }
Mais maintenant, lorsque vous l'exécuterez, vous verrez que notre chaîne est simplement affichée dans la console. Il n'y a pas de lecture à partir du clavier. Nous avons remplacé la source de données. Ce n'est plus le clavier, mais notre corde ! C'est aussi simple que ça :) Dans la leçon d'aujourd'hui, nous avons appris à connaître une nouvelle classe et exploré un petit nouveau hack pour travailler avec les E/S. Il est maintenant temps de reprendre le cours et d'accomplir certaines tâches :) À la prochaine leçon !
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION