Quelle est la différence entre BufferedReader et InputStreamReader en Java?


Réponse 1:

BufferedReader lit quelques caractères du flux spécifié et les stocke dans un tampon. Cela rend l'entrée plus rapide.

InputStreamReader lit un seul caractère du flux spécifié et les caractères restants restent toujours dans le flux.

Exemple:

classe NewClass {
    public static void main (String args []) lève InterruptedException, IOException {

        BufferedReader isr = nouveau BufferedReader (nouveau InputStreamReader (System.in));

        Scanner sc = nouveau scanner (System.in);

        System.out.println ("B.R. -" + (char) isr.read ());
        System.out.println ("Scanner -" + sc.nextLine ());
    }
}

Lorsque l'instruction isr.read () est exécutée, j'ai entré l'entrée «bonjour» et le caractère «h» de «bonjour» est imprimé à l'écran. S'il s'agissait de InputStreamReader, les caractères restants «ello» seraient restés dans le flux System.in et le sc.nextLine () les aurait imprimés. Mais dans ce cas, cela ne se produit pas car le BufferedReader lit tous les caractères «bonjour» du flux System.in et les stocke dans son propre tampon personnel et donc le flux System.in reste vide lorsque sc.nextLine () est réalisé.

Pour le code:

classe NewClass {

    public static void main (String args []) lève InterruptedException, IOException {

        InputStreamReader isr = new InputStreamReader (System.in);

        Scanner sc = nouveau scanner (System.in);

        System.out.println ("I.S.R. -" + (char) isr.read ());
        System.out.println ("Scanner -" + sc.nextLine ());
                
    }
}

Dans ce cas, InputStreamReader ne lit qu'un seul caractère pour l'entrée «hello» et le «ello» restant reste toujours dans le flux System.in et ces caractères sont imprimés par sc.nextLine ();

Conclusion:

BufferedReader lit quelques caractères (même si nous ne voulons qu'un seul caractère, il lira plus que cela) du flux d'entrée et les stocke dans un tampon. C'est pourquoi il s'appelle BufferedReader. Je n'ai pas pu déterminer le nombre de caractères lus en une seule fois. Cela variait de 3 à 10 lorsque je l'ai testé pour cette réponse.

InputStreamReader lit un seul caractère du flux d'entrée et les caractères restants restent toujours dans le flux. Il n'y a pas de tampon intermédiaire dans ce cas.

Lorsqu'un ou plusieurs threads ou objets souhaitent lire des caractères à partir de System.in, dans ce cas, InputStreamReader doit être utilisé car il ne lit qu'un seul caractère et le reste peut être utilisé par d'autres objets ou threads.

BufferedReader est rapide car il maintient un tampon et la récupération des données du tampon est toujours rapide par rapport à la récupération des données du disque / stdin.

J'espère que ça aide. Si vous avez un doute, veuillez demander en commentant. Je ferai de mon mieux pour les effacer.


Réponse 2:

Référence: Decodejava.com présentant un tutoriel Java simple et facile

Les opérations d'entrée / sortie de fichier consomment beaucoup de ressources importantes et prennent du temps. Par conséquent, la lecture d'un morceau de caractères dans un fichier et son stockage dans un tampon local pour un traitement ultérieur est plus rapide et que la lecture d'un caractère à la fois, dans un fichier.

Par conséquent, la classe BufferedReader est utilisée pour créer un tel flux de lecteur tamponné à travers lequel un morceau de caractères est lu dans un fichier et transféré vers un tampon local pour une utilisation ultérieure.

Pour en savoir plus sur BufferedReader avec un exemple de code simple, vous pouvez lire Java BufferedReader Class - Decodejava.com

InputStreamReader est enroulé autour d'un flux d'entrée (qui lit en octets) pour lire des données sous forme de caractères, donc la classe InputStreamReader agit comme un convertisseur d'octets en caractères.

Pour plus d'informations sur InputStreamReader avec un exemple de code simple, vous pouvez lire Java InputStreamReader Class - Decodejava.com

J'espère que cela aide,

Bonne chance!


Réponse 3:

Un InputStreamReader est un pont entre les flux d'octets et les flux de caractères: il lit les octets et les décode en caractères à l'aide d'un jeu de caractères spécifié. Le jeu de caractères qu'il utilise peut être spécifié par son nom ou donné explicitement, ou le jeu de caractères par défaut de la plateforme peut être accepté.

Chaque appel d'une des méthodes read () d'un InputStreamReader peut entraîner la lecture d'un ou plusieurs octets à partir du flux d'entrée d'octets sous-jacent. Pour permettre la conversion efficace d'octets en caractères, davantage d'octets peuvent être lus à l'avance à partir du flux sous-jacent que nécessaire pour satisfaire l'opération de lecture en cours.

Pour une efficacité optimale, pensez à encapsuler un InputStreamReader dans un BufferedReader. Par exemple:

 BufferedReader in
   = nouveau BufferedReader (nouveau InputStreamReader (System.in));
public class BufferedReader étend Reader

Lit le texte à partir d'un flux d'entrée de caractères, en mettant les caractères en mémoire tampon de manière à permettre une lecture efficace des caractères, des tableaux et des lignes.

La taille du tampon peut être spécifiée ou la taille par défaut peut être utilisée. La valeur par défaut est suffisamment grande pour la plupart des applications.

En général, chaque demande de lecture faite à partir d'un lecteur entraîne une demande de lecture correspondante à partir du flux de caractères ou d'octets sous-jacent. Il est donc conseillé d'enrouler un BufferedReader autour de tout lecteur dont les opérations read () peuvent être coûteuses, telles que FileReaders et InputStreamReaders. Par exemple,

 BufferedReader in
   = nouveau BufferedReader (nouveau FileReader ("foo.in"));

Réponse 4:
  • Un InputStreamReader crée un nouvel objet de flux, qui peut être utilisé pour lire des données à partir de la source spécifiée. Il s'agit d'un pont entre les flux d'octets et les flux de caractères. Il lit les octets et les décode en caractères à l'aide d'un jeu de caractères spécifié. Le jeu de caractères qu'il utilise peut être spécifié par son nom ou le jeu de caractères par défaut de la plate-forme peut être accepté.BufferedReader est une abstraction qui lit le texte d'un flux d'entrée de caractères. Il met les caractères en mémoire tampon pour fournir une lecture efficace des caractères et des lignes. C'est une classe qui est utilisée pour lire le texte d'un flux d'entrée basé sur des caractères. Il peut être utilisé pour lire des données ligne par ligne par la méthode readLine (). Cela rend les performances rapides. Il hérite de la classe Reader.