web-dev-qa-db-fra.com

Que signifient exactement "Stream" et "Buffer" dans Java I / O?

Je viens d'apprendre à propos des entrées/sorties en utilisant BufferedReader.

Je voulais savoir quelle est exactement la signification du terme Stream et Buffer?

De plus, à quoi sert cette ligne de code:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
75
user122345656

Java a deux types de classes pour les entrées et les sorties (E/S): les flux et les lecteurs .

Les flux (InputStream, OutputStream et tout ce qui les étend) servent à lire et à écrire des données binaires à partir de fichiers, du réseau ou de tout autre périphérique.

Les lecteurs et les rédacteurs sont pour lire et écrire du texte (caractères). Ils sont une couche au-dessus des flux, qui convertit les données binaires (octets) en caractères, et inversement, en utilisant un encodage de caractères .

La lecture des données d'un disque octet par octet est très inefficace. Une façon d'accélérer le processus consiste à utiliser un tampon: au lieu de lire un octet à la fois, vous pouvez lire quelques milliers d'octets à la fois et les mettre dans un tampon, en mémoire. Ensuite, vous pouvez regarder les octets dans le tampon un par un.

Le Java) de Oracle à propos des E/S l'explique en détail.

En regardant la ligne de code que vous avez fournie:

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

System.in est un InputStream. Vous créez un InputStreamReader qui lit les octets de System.in. Ensuite, vous enroulez cela dans un BufferedReader.

Donc, au final, vous avez un BufferedReader qui lit un InputStreamReader qui lit un System.in.

182
Jesper

Eh bien, c’est une question qui préoccupe tous les gens qui commencent à travailler sur le package Java.io. Pour répondre à votre question, les termes InputStreamReader et BufferedReader représentent uniquement les objets Java (ils n'ont rien de particulier)), mais ils sont créés pour des opérations io telles que la lecture et l'écriture à partir de/vers différents , objet etc.

Maintenant, allons à la ligne

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

InputStreamReader est la classe qui lit le flux d'entrée d'octets. Mais lire chaque octet est une opération coûteuse et nous l'encapsulons donc autour de BufferedReader pour qu'il soit mis en mémoire tampon (ce qui est un motif décorateur)

Donc, ce qui se passera est que même avant de commencer à lire, bufferedReader stockera une partie des octets dans le registre et lors de l'exécution de l'opération de lecture. il sera lu à partir de cet emplacement, ce qui coûtera beaucoup moins cher que de lire console/fichier. Cependant, dans le cas de InputStreamReader, lorsque vous effectuez une opération de lecture à chaque fois qu'une opération d'accès au disque a lieu

14
M Sach

Tampon:

C'est une région d'une mémoire physique utilisé pour stocker temporairement des données lorsqu’elles sont déplacées d’un endroit à un autre. Ce mémoire physique serait [~ # ~] ram [~ # ~] (Random- mémoire d'accès) dans la plupart des cas.

Mais à partir du contexte de cette question, Le tampon est utilisé lors de la lecture/écriture des données. Il n’est pas nécessaire de l’utiliser pour déplacer des données d’un endroit à un autre.

Exemple de tampon: Si votre système dispose de 4 Go de RAM, vous pouvez allouer 4 Ko de mémoire vive (RAM) à Buffer. par le système. KB - Kilo-octet (s), GB - Gigaoctet (s)

flux d'E/S (ou) flux:

Flux d'E/S représente une source d'entrée ou une destination de sortie. Un flux peut représenter différents types de sources et de destinations, y compris des fichiers de disque, des périphériques, d'autres programmes et des matrices de mémoire.

I/O signifie entrée/sortie.

Ainsi, Input Stream peut être une source d'entrée telle qu'un fichier disque, une connexion réseau, etc.

De plus, Output Stream peut être une destination de sortie telle qu'un fichier disque, une connexion réseau, etc.

Selon documentation officielle Java , les flux sont de 3 types.

  1. flux d'octets (lecture ou écriture d'octets)
  2. flux de caractères (lire ou écrire des caractères)
  3. flux tamponnés (lire ou écrire dans tampon pour plus d'efficacité)

Flux d'octets:

Ils effectuent des entrées et des sorties d'octets de 8 bits. Toutes les classes de flux d'octets sont issues de InputStream et OutputStream .

Octet d'entrée Les classes de flux obtiennent leur entrée sous forme de octets bruts . Les classes de flux de sortie d'octets donnent la sortie sous forme de octets bruts .

InputStream - Sous-classes connues directes

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.

OutputStream - Sous-classes connues directes

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

Flux de caractères: Ils forment une couche au-dessus des flux d'octets. Ils convertissent des octets (données binaires) en caractères et des caractères en octets, en utilisant un codage de caractères.

Toutes les classes de flux de caractères sont issues de Reader et Writer .

Reader - Sous-classes directes connues

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

Writer - Sous-classes directes connues

BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

Flux d'octets et flux de caractères utilisent des E/S non mises en tampon .

Cela signifie que chaque demande de lecture ou d'écriture est traitée directement par le système d'exploitation sous-jacent. Cela peut rendre un programme beaucoup moins efficace, car chaque requête déclenche souvent un accès au disque, une activité du réseau ou toute autre opération relativement coûteuse. Pour réduire ce type de surcharge, la plate-forme Java implémente des flux d'E/S mis en mémoire tampon.

Flux mis en tampon:

Les flux d’entrée tamponnés lisent les données depuis une zone de mémoire appelée tampon ; L'API d'entrée native n'est appelée que lorsque le tampon est vide.

De même, les flux de sortie mis en mémoire tampon écrivent des données dans un tampon , et l'API de sortie native n'est appelée que lorsque le tampon est plein.

Un programme peut convertir un flux non tamponné en un flux tamponné à l'aide de l'idiome d'habillage, où l'objet de flux non mis en tampon est transmis au constructeur pour une classe de flux mise en mémoire tampon .

Exemple:

inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));

Il existe 4 classes de flux mises en mémoire tampon qui sont utilisées pour envelopper des flux non mis en mémoire tampon:

Pour créer mis en tampon Flux d'octets utilise, BufferedInputStream et BufferedOutputStream classes.

Pour créer mis en mémoire tampon Flux de caractères utilise, BufferedReader et BufferedWriter classes.

12
AnV

Un flux est la connexion et les informations réelles transmises entre les points. La mémoire tampon est un conteneur de stockage qui stocke une partie ou la totalité des données diffusées et le transmet au périphérique de sortie.

Bien entendu, si le flux ralentit au-delà du débit requis pour afficher les données, la sortie est suspendue. Le tampon empêche cela.

3
PGallagher

Un tampon est une partie de la mémoire utilisée pour stocker un flux de données provenant de périphériques. Ensuite, à partir de cette mémoire tampon, ce flux de données est collecté et stocké dans des variables. Un flux peut être défini comme un flux continu de données.

Le terme même "entrée/sortie" ne signifie rien de plus que le déplacement de données dans les tampons. Gardez cela à l’esprit tout le temps. Les processus effectuent des E/S en demandant au système d’exploitation que les données soient drainées d’un tampon (opération d’écriture) ou qu’un tampon soit rempli de données (opération de lecture).
Diagramme logique de la manière dont les données se déplacent

En termes simples, imaginez que lorsque vous tapez des données sur un clavier, celles-ci passent par un tuyau (le flux ((== --- ==)) ) vers le tampon, puis entre tampon disque (opération d'écriture). De même, lorsque les données sont déplacées du disque vers du tampon et du tampon vers votre console, l'opération est alors lue.

Vous pouvez lire les liens pour une meilleure compréhension. J'espère que ça aide!.
Qu'est-ce qu'un tampon en Java
entrez la description du lien ici

0
Kushagra