BufferedReader vs Console vs Scanner en Java

1. Vue d'ensemble

Dans cet article, nous allons parcourir les différences entre les classes BufferedReader , Console et Scanner en Java .

Pour approfondir chaque sujet, nous vous suggérons de consulter nos articles individuels sur Java Scanner, Console I / O in Java et BufferedReader.

2. Entrée utilisateur

Étant donné le flux sous-jacent transmis aux constructeurs, les classes BufferedReader et Scanner sont capables de gérer une plus large gamme d'entrées utilisateur , telles qu'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 classe Console 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 constructeurs BufferedReader , 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 classe Scanner 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 classe Console est disponible uniquement via l'appel de méthode:

Console console = System.console();

Veuillez garder à l'esprit que lorsque nous utilisons la classe Console , 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

Contrairement aux classes BufferedReader et Scanner , qui n'écrivent rien dans le flux de sortie, la classe Console propose des méthodes pratiques comme readPassword (String fmt, Object… args), readLine (String fmt, Object… args) et printf ( Format de chaîne, Object… args) , pour écrire l'invite dans le flux de sortie de la console système :

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 classe Console simplifiera le code en supprimant System.out.println inutile .

4. Analyse de l'entrée

La classe Scanner peut analyser les types primitifs et les chaînes à l'aide d'expressions régulières .

Il divise son entrée en jetons à l'aide d'un modèle 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 classes BufferredReader et Console lisent simplement le flux d'entrée tel quel.

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

La classe Console a les méthodes readPassword () et readPassword (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 et Scanner n'ont pas la capacité de le faire.

6. Thread Safe

Les méthodes de lecture dans BufferedReader et les méthodes de lecture et d'écriture dans la console sont toutes synchronisées , contrairement à celles de la classe Scanner . Si nous lisons l'entrée utilisateur dans un programme multi-thread, BufferedReader ou Console sera une meilleure option.

7. Taille du tampon

La taille du tampon est de 8 Ko dans BufferedReader par rapport à 1 Ko dans la classe Scanner .

De plus, nous pouvons spécifier la taille du buffer dans le constructeur de la classe BufferedReader si nécessaire. Cela vous aidera lors de la lecture des longues chaînes à partir de l'entrée utilisateur. La classe de console n'a pas de tampon lors de la lecture à partir de la console système , mais elle dispose d'un flux de sortie mis en mémoire tampon pour écrire dans la console système.

8. Divers

Il existe certaines différences qui 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. Fermeture du flux d'entrée

Une fois que nous avons créé l'instance de BufferedReader ou Scanner , nous devons nous rappeler de la fermer afin d'éviter une fuite de mémoire . Mais cela ne se produit pas avec la classe Console - nous n'avons pas besoin de fermer la console système après utilisation.

8.2. Gestion des exceptions

Alors que Scanner et Console utilisent l'approche des exceptions non vérifiées , les méthodes de BufferedReader 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 quelques règles de base concernant celle (s) qui convient le mieux pour aborder différentes situations :

  • Use BufferedReader if we need to read long strings from a file, as it has better performance than Scanner
  • Consider Console if we're reading secure data from the system console and want to hide what is being typed
  • Use Scanner if we need to parse the input stream with a custom regular expression
  • Scanner would be preferred when we interact with the system console, as it offers fine-grained methods to read and parse the input stream. In addition, the performance drawback is not a big problem, as in most cases, the nextXXX methods are blocking and wait for manual input
  • Dans un contexte thread-safe, considérez BufferedReader sauf si nous devons utiliser des fonctionnalités spécifiques à la classe Console