BufferedReader vs Console vs Scanner en Java

BufferedReader vs Console vs Scanner en Java

1. Vue d'ensemble

Dans cet article, nous allons àwalk through the differences between BufferedReader, Console, and Scanner classes in Java.

Pour approfondir chaque sujet, nous vous suggérons de jeter un coup d'œil à nos articles individuels surJava Scanner,Console I/O in Java etBufferedReader.

2. Entrée utilisateur

Étant donné le flux sous-jacent transmis aux constructeurs,both BufferedReader and Scanner classes are able to handle a wider range of user input, comme une chaîne, un fichier, une console système (qui est généralement connectée au clavier) et un socket.

D'autre part, la classeConsole est conçue pour accéder uniquement à la console système basée sur des caractères, le cas échéant, associée à la machine virtuelle Java actuelle.

Jetons un coup d'œil aux constructeursBufferedReader, qui acceptent différentes entrées:

BufferedReader br = new BufferedReader(
  new StringReader("Bufferedreader vs Console vs Scanner in Java"));
BufferedReader br = new BufferedReader(
  new FileReader("file.txt"));
BufferedReader br = new BufferedReader(
  new InputStreamReader(System.in))

Socket socket = new Socket(hostName, portNumber);
BufferedReader br =  new BufferedReader(
  new InputStreamReader(socket.getInputStream()));

La classeScanner pourrait également accepter différentes entrées dans ses constructeurs:

Scanner sc = new Scanner("Bufferedreader vs Console vs Scanner in Java")
Scanner sc = new Scanner(new File("file.txt"));
Scanner sc = new Scanner(System.in);

Socket socket = new Socket(hostName, portNumber);
Scanner sc =  new Scanner(socket.getInputStream());

La classeConsole est disponible uniquement via l'appel de méthode:

Console console = System.console();

Veuillez garder à l'esprit que lorsque nous utilisons la classeConsole, la console système associée à la JVM n'est pas disponible si nous exécutons le code dans un IDE tel qu'Eclipse ou IntelliJ IDEA.

3. Sortie utilisateur

In contrast to BufferedReader and Scanner classes, which don’t write anything to the output stream, the Console class offers some convenient methods commereadPassword (String fmt, Object… args), readLine (String fmt, Object… args), etprintf (String format,Object… args),to write the prompt to the system console’s output stream:

String firstName = console.readLine("Enter your first name please: ");
console.printf("Welcome " + firstName );

Ainsi, lorsque nous écrivons un programme pour interagir avec la console système, la classeConsole simplifiera le code en supprimant lesSystem.out.println inutiles.

4. Analyse syntaxique

The Scanner class can parse primitive types and strings using regular expressions.

Il décompose son entrée en jetons à l'aide d'un motif de délimiteur personnalisé, qui correspond par défaut aux espaces:

String input = "Bufferedreader vs Console vs Scanner";
Scanner sc = new Scanner(input).useDelimiter("\\s*vs\\s*");
System.out.println(sc.next());
System.out.println(sc.next());
System.out.println(sc.next());
sc.close();

Les classesBufferredReader etConsole lisent simplement le flux d'entrée tel quel.

5. Lecture de données sécurisées

La classeConsole a les méthodesreadPassword() etreadPassword (String fmt, Object… args) pour lire les données sécurisées avec l'écho désactivé afin que les utilisateurs ne voient pas ce qu'ils tapent:

String password = String.valueOf(console.readPassword("Password :"));

BufferedReader etScanner n'ont pas la capacité de le faire.

6. Fil Coffre-fort

Les méthodes de lecture dansBufferedReader et les méthodes de lecture et d'écriture dansConsole sont toutessynchronized, alors que celles de la classeScanner ne le sont pas. If we read the user input in a multi-threaded program, either BufferedReader or Console will be a better option.

7. Taille du tampon

The buffer size is 8 KB in BufferedReader as compared to 1 KB in Scanner class.

De plus, nous pouvons spécifier la taille du tampon dans le constructeur de la classethe BufferedReader si nécessaire. Cela aidera lors de la lecture des longues chaînes de données saisies par l'utilisateur. Console class has no buffer when reading from the system console, mais il a un flux de sortie mis en mémoire tampon pour écrire sur la console système.

8. Divers

Certaines différences ne sont pas les principaux facteurs que nous prenons en compte lors du choix de la classe appropriée à utiliser dans diverses situations.

8.1. Fermer le flux d'entrée

Une fois que nous avons créé l'instance deBufferedReader ouScanner, nous avons besoin deremember to close it in order to avoid a memory leak. Mais cela ne se produit pas avec la classeConsole - nous n'avons pas besoin de fermer la console système après utilisation.

8.2. Gestion des exceptions

Alors queScanner etConsole suivent l'approche d'exception non vérifiée, les méthodes deBufferedReader lancent des exceptions vérifiées, ce qui nous oblige à écrire une syntaxe try-catch standard pour gérer les exceptions.

9. Conclusion

Maintenant que nous avons indiqué les différences entre ces classes, imaginons quelquesrules of thumb regarding which one(s) are best suited to tackle different situations:

  • UtilisezBufferedReader si nous avons besoin de lire de longues chaînes à partir d'un fichier, car il a de meilleures performances queScanner

  • ConsidérezConsole si nous lisons des données sécurisées à partir de la console système et que nous voulons masquer ce qui est saisi

  • UtilisezScanner si nous devons analyser le flux d'entrée avec une expression régulière personnalisée

  • Scanner serait préférable lorsque nous interagissons avec la console système, car il offre des méthodes précises pour lire et analyser le flux d'entrée. De plus, l'inconvénient des performances n'est pas un gros problème, car dans la plupart des cas, les méthodesnextXXX bloquent et attendent une entrée manuelle

  • Dans un contexte thread-safe, considérezBufferedReader sauf si nous devons utiliser des fonctionnalités spécifiques à la classeConsole