99 votes

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

Je viens d'apprendre les entrées/sorties en utilisant BufferedReader .

Je voulais savoir quelle est la signification exacte du terme Stream y Buffer ?

Aussi, à quoi nous sert cette ligne de code :

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

218voto

Jesper Points 65733

Java dispose de deux types de classes pour les entrées et les sorties (E/S) : ruisseaux y lecteurs/écrivains .

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 écrivains servent à lire et à écrire des textes (caractères). Ils constituent une couche au-dessus des flux, qui convertit les données binaires (octets) en caractères et inversement, à l'aide d'un algorithme de lecture et d'écriture. codage des caractères .

La lecture des données sur le disque, octet par octet, est très inefficace. Une façon de l'accélérer est d'utiliser une mémoire tampon : au lieu de lire un octet à la fois, vous lisez quelques milliers d'octets en une seule fois et vous les placez dans une mémoire tampon, en mémoire. Vous pouvez ensuite examiner les octets de la mémoire tampon un par un.

Le tutoriel Java d'Oracle à propos de I/O 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 . Puis vous l'enveloppez dans un BufferedReader .

Donc, à la fin, vous avez un BufferedReader qui lit à partir d'un InputStreamReader qui lit dans System.in .

27voto

AnV Points 1629

Tampon :

Il s'agit d'un région d'une mémoire physique utilisé pour stocker temporairement des données pendant qu'elles sont déplacées d'un endroit à un autre. Ce site stockage de la mémoire physique serait RAM (Random-access memory) dans la plupart des cas.

Mais d'après le contexte de cette question, 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, 4 Ko de mémoire (RAM) peuvent être alloués pour les éléments suivants Tampon par le système. Ko - Kilobyte(s), GB - Gigabyte(s)

Flux d'E/S (ou) Stream :

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

I/O signifie entrée/sortie.

Ainsi, le flux d'entrée peut être une source d'entrée comme un fichier disque, une connexion réseau, etc.

Et, le flux de sortie peut être une destination de sortie comme un fichier disque, une connexion réseau, etc.

Selon Documentation officielle de JAVA Les cours d'eau sont de 3 types.

  1. Flux d'octets (lecture ou écriture d'octets)
  2. Filières de caractères (lire ou écrire des caractères)
  3. Cours d'eau tamponnés (lire à partir de, ou écrire à, Tampon pour l'efficacité)

Flux d'octets :

Ils effectuent l'entrée et la sortie d'octets de 8 bits. Toutes les classes de flux d'octets descendent de InputStream y OutputStream .

Les classes de flux d'entrée d'octets obtiennent l'entrée comme octets bruts . Les classes de flux de sortie d'octets donnent une sortie comme octets bruts .

InputStream - Sous-classes directes connues

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

OutputStream - Sous-classes directes connues

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

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

Toutes les classes de flux de caractères descendent de Lecteur y Écrivain .

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 utiliser E/S non tamponnées .

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 chacune de ces requêtes déclenche souvent un accès au disque, une activité réseau, ou toute autre opération relativement coûteuse. Pour réduire ce type de surcharge, la plate-forme Java met en œuvre des fonctions de mise en mémoire tampon. flux d'E/S.

Cours d'eau tamponnés :

Flux d'entrée tamponnés lire les données à partir de une zone de mémoire connue sous le nom de tampon ; l'API d'entrée native n'est appelée que lorsque le tampon est vide.

De même, les flux de sortie tamponnés écrire des données dans un tampon et l de sortie native n'est appelée que lorsque le tampon est plein.

Un programme peut convertir un sans tampon dans un tamponné flux en utilisant l'idiome de l'enveloppement, où l'élément sans tampon est passé au constructeur d'un objet de type tamponné classe de flux.

Exemple :

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

Il existe 4 classes de flux tamponnés qui sont utilisées pour envelopper les flux non tamponnés :

Pour créer tamponné Flux d'octets utiliser, BufferedInputStream y BufferedOutputStream classes.

Pour créer tamponné Filières de caractères utiliser, BufferedReader y BufferedWriter classes.

15voto

M Sach Points 6078

C'est une question que tout le monde se pose lorsqu'on commence à travailler sur le paquet java.io. Pour répondre à votre question, InputStreamReader et BufferedReader ne représentent que des objets java (ils n'ont rien de spécial), mais ils sont créés pour des opérations io comme la lecture et l'écriture à partir de/vers différentes entrées/sorties comme un fichier, un objet, etc.

Passons maintenant à la ligne

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

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

Ainsi, avant même de commencer la lecture, le BufferedReader stockera un certain nombre d'octets dans le registre et lorsque vous effectuerez l'opération de lecture, il sera lu à partir de cet emplacement, ce qui est beaucoup moins coûteux que de lire à partir de la console ou d'un fichier. Mais dans le cas de l'InputStreamReader, lorsque vous effectuez l'opération de lecture, chaque accès au disque a lieu.

3voto

PGallagher Points 1974

Un flux est la connexion et l'information réelle qui passe entre les points. Le tampon est un conteneur de stockage qui stocke une partie ou la totalité des données transmises et les transmet au périphérique de sortie.

Bien sûr, l'idée est que si le flux ralentit au-delà du débit requis pour afficher les données, la sortie s'interrompt. Le tampon empêche cela.

1voto

Kushagra Points 59

Une mémoire tampon est une partie de la mémoire qui est utilisée pour stocker un flux de données provenant de périphériques. Ensuite, à partir de ce 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 d'"entrée/sortie" ne signifie rien d'autre que le déplacement de données dans et hors des tampons. Gardez cela à l'esprit en permanence. Les processus effectuent des E/S en demandant au système d'exploitation de vider un tampon (opération d'écriture) ou de le remplir de données (opération de lecture).
Diagramme logique de la circulation des données

En termes simples, imaginez que lorsque vous tapez des données sur un clavier, ces données passent par un tuyau (le flux ) vers le tampon et ensuite du tampon vers le disque (opération d'écriture). De même, lorsque les données passent du disque à tampon et du tampon à votre console alors c'est une opération de lecture.

Vous pouvez lire les liens pour mieux comprendre. J'espère que cela vous aidera !
Qu'est-ce qu'un tampon en Java
Entrez la description du lien ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X