JavaRush /Blog Java /Random-FR /Entraînez-vous à travailler avec les classes BufferedRead...

Entraînez-vous à travailler avec les classes BufferedReader et InputStreamReader

Publié dans le groupe Random-FR
Bonjour! La conférence d'aujourd'hui sera divisée en deux parties. Nous allons répéter certains des anciens sujets que nous avons déjà abordés auparavant et examiner quelques nouvelles fonctionnalités :) Entraînez-vous à travailler avec les classes BuffreredReader et InputStreamReader - 1Commençons par le premier. La répétition est la mère de l'apprentissage :) Vous avez déjà utilisé un cours tel que BufferedReader. J'espère que vous n'avez pas encore oublié cette commande :
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Avant de poursuivre votre lecture, essayez de vous rappeler de quoi chaque composant ( System.in, InputStreamReader, BufferedReader) est responsable et à quoi il sert. Arrivé? Sinon, ne vous inquiétez pas :) Si à ce stade vous avez oublié quelque chose, relisez cette conférence dédiée aux lecteurs. Rappelons brièvement ce que chacun d'eux peut faire. System.inest un fil pour recevoir des données du clavier. En principe, pour mettre en œuvre la logique de lecture du texte, un seul nous suffirait. Mais, comme vous vous en souvenez, System.inil ne peut lire que des octets, pas des caractères :
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Si nous exécutons ce code et entrons la lettre « Y » dans la console, le résultat ressemblera à ceci :

Й
208
153
10
Les caractères cyrilliques occupent 2 octets en mémoire, qui sont affichés à l'écran (et le chiffre 10 est la représentation en octets d'un saut de ligne, c'est-à-dire en appuyant sur Entrée). Lire des octets est un tel plaisir, donc l'utiliser System.insous sa forme pure sera peu pratique. Afin de lire des lettres cyrilliques (et pas seulement) compréhensibles par tous, nous utilisons InputStreamReadercomme wrapper :
public class Main {

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

       InputStreamReader reader = new InputStreamReader(System.in);
       while (true) {
           int x = reader.read();
           System.out.println(x);
       }
   }
}
Si nous entrons la même lettre « Y » dans la console, le résultat cette fois sera différent :

Й
1049
10
InputStreamReaderconverti les deux octets lus (208, 153) en un seul nombre 1049. Il s'agit d'une lecture par caractères. 1049 correspond à la lettre « Y », qui peut être facilement vérifiée :
public class Main {

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

       char x = 1049;
       System.out.println(x);
   }
}
Sortie de la console :

Й
Eh bien, comme pour BufferedReader'a (et en général - BufferedAnything), les classes tamponnées sont utilisées pour optimiser les performances. Accéder à une source de données (fichier, console, ressource sur Internet) est une opération assez coûteuse en termes de performances. Par conséquent, afin de réduire le nombre de ces appels, BufferedReaderil lit et accumule les données dans un tampon spécial, d'où nous pouvons les recevoir ultérieurement. De ce fait, le nombre d'appels à la source de données est réduit de plusieurs fois, voire des dizaines de fois ! Une autre caractéristique supplémentaire de BufferedReader« a et son avantage par rapport au standardInputStreamReader » est la méthode extrêmement utile readLine()qui lit les données sous forme de chaînes entières plutôt que sous forme de nombres individuels. Ceci, bien sûr, ajoute grandement à la commodité lors de la mise en œuvre, par exemple, de textes volumineux. Voici à quoi ressemblerait la lecture d’une ligne :
public class Main {

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

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       String s = reader.readLine();
       System.out.println("Пользователь ввел следующий текст:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Entraînez-vous à travailler avec les classes BuffreredReader et InputStreamReader - 2Bien entendu, BufferedReaderil s’agit d’un mécanisme très flexible qui vous permet de travailler non seulement avec le clavier. Vous pouvez par exemple lire des données directement depuis Internet en transmettant simplement l'URL requise au lecteur :
public class URLReader {
   public static void main(String[] args) throws Exception {

       URL oracle = new URL("https://www.oracle.com/index.html");
       BufferedReader in = new BufferedReader(
               new InputStreamReader(oracle.openStream()));

       String inputLine;
       while ((inputLine = in.readLine()) != null)
           System.out.println(inputLine);
       in.close();
   }
}
Vous pouvez lire les données d'un fichier en lui transmettant le chemin :
public class Main {
   public static void main(String[] args) throws Exception {

       FileInputStream fileInputStream = new FileInputStream("testFile.txt");
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));

       String str;

       while ((str = reader.readLine()) != null)   {
           System.out.println (str);
       }

       reader.close();
   }
}

Remplacement de System.out

Examinons maintenant une possibilité intéressante que nous n’avons pas abordée auparavant. Comme vous vous en souvenez probablement, Systemil existe deux champs statiques dans la classe : System.inet System.out. Ces frères jumeaux sont des objets de classe thread. System.in- classe abstraite InputStream. Une System.outclasse PrintStream. Nous allons maintenant parler spécifiquement de System.out. Si nous allons dans le code source de la classe System, nous verrons ceci :
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
Donc, System.outjuste une variable de classe statique normaleSystem . Il n'y a pas de magie là-dedans :) La variable outappartient à la classe PrintStream. Voici une question intéressante : pourquoi, lors de l'exécution du code, System.out.println()la sortie apparaît-elle dans la console et pas ailleurs ? Et est-il possible de changer cela d’une manière ou d’une autre ? Par exemple, nous souhaitons lire les données de la console et les écrire dans un fichier texte. Est-il possible d'implémenter une telle logique sans utiliser de classes de lecture et d'écriture supplémentaires, mais simplement en utilisant System.out? Toujours autant que possible :) Et bien que la variable System.outsoit désignée par un modificateur final, on peut toujours le faire ! Entraînez-vous à travailler avec les classes BuffreredReader et InputStreamReader - 3Alors de quoi avons-nous besoin pour cela ? Premièrement , nous avons besoin d’un nouvel objet de classe PrintStreamau lieu de l’objet actuel. L'objet courant installé dans la classe Systempar défaut ne nous convient pas : il pointe vers la console. Nous devons en créer un nouveau qui pointera vers un fichier texte comme « destination » de nos données. Deuxièmement , vous devez comprendre comment attribuer une nouvelle valeur à une variable System.out. Vous ne pouvez pas faire comme ça, parce que c’est marqué final. Commençons par la fin. La classe Systemcontient exactement la méthode dont nous avons besoin - setOut(). Il prend un objet en entrée PrintStreamet le définit comme point de sortie. Juste ce dont nous avons besoin ! Il ne reste plus qu'à créer l'objet PrintStream. C'est aussi facile à faire :
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Le code entier ressemblera à ceci :
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       /*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое meaning
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое meaning
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
En conséquence, la première ligne sera écrite dans un fichier texte et la seconde sera sortie sur la console :) Vous pouvez copier ce code dans votre IDE et l'exécuter. En ouvrant le fichier texte, vous verrez que la ligne requise y a été écrite avec succès :) Ceci conclut la conférence. Aujourd'hui, nous avons rappelé comment travailler avec les flux et les lecteurs, rappelé en quoi ils diffèrent les uns des autres et découvert les nouvelles fonctionnalités System.outque nous avons utilisées dans presque toutes les leçons :) Rendez-vous dans les prochaines conférences !
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION