Cet article analyse la différence entre les flux de caractères et les flux d'octets en Java pour votre référence. Le contenu spécifique est le suivant
1. Qu'est-ce que le flux
Le flux en Java est une abstraction des séquences d'octets. Nous pouvons imaginer qu'il y a un tuyau d'eau, mais maintenant il ne s'agit plus d'eau dans le tuyau d'eau, mais une séquence d'octets. Comme les flux d'eau, les ruisseaux en Java ont également une "direction de débit". Un objet à partir duquel une séquence d'octets peut être lu est appelée un flux d'entrée; Un objet dans lequel une séquence d'octets est écrite est appelée un flux de sortie.
2. Stream d'octets
L'unité la plus élémentaire du traitement des flux d'octets en Java est un octet unique, qui est généralement utilisé pour traiter les données binaires. Les deux classes de flux d'octets les plus élémentaires dans Java sont EntréeStream et OutputStream, qui représentent respectivement le groupe de flux d'octets d'entrée de base et de flux d'octets de sortie. La classe InputStream et la classe OutputStream sont des classes abstraites. En usage réel, nous utilisons généralement une série de sous-classes d'entre elles fournies dans la bibliothèque de classe Java. Prenons la classe InputStream comme exemple pour introduire le flux d'octets en Java.
La classe InputStream définit une méthode de base lue pour la lecture des octets à partir d'un flux d'octets. La définition de cette méthode est la suivante:
Public Abstract int Read () lève IOException;
Il s'agit d'une méthode abstraite. La fonction de cette méthode est de lire un octet à partir du flux d'octets et de retourner -1 s'il atteint la fin, sinon renvoyez l'octet de lecture. Ce que nous devons noter sur cette méthode, c'est qu'il continuera de bloquer et de renvoyer un octet de lecture ou -1. De plus, les flux d'octets ne prennent pas en charge la mise en cache par défaut, ce qui signifie que chaque fois que la méthode de lecture est appelée, le système d'exploitation demandera au système d'exploitation de lire un octet, qui est souvent accompagné d'un disque IO, donc il sera relativement inefficace. Certains amis peuvent penser que la méthode de lecture surchargée dans la classe InputStream avec un tableau d'octets en tant que paramètres peut lire plusieurs octets à la fois sans disque fréquent IO. Alors, est-ce le cas? Jetons un coup d'œil au code source de cette méthode:
public int Read (byte b []) lève ioException {return read (b, 0, b.length);}Il appelle une autre version de la méthode de surcharge de lecture, nous continuerons donc à suivre:
public int read (byte b [], int off, int len) lève ioException {if (b == null) {lance new nullpointerException (); } else if (off <0 || len <0 || len> b.length - off) {throw new indexOutofboundSexception (); } else if (len == 0) {return 0; } int c = read (); if (c == -1) {return -1; } b [off] = (byte) c; int i = 1; essayez {pour (; i <len; i ++) {c = read (); if (c == -1) {break; } b [off + i] = (byte) c; }} catch (ioException ee) {} return i; }À partir du code ci-dessus, nous pouvons voir qu'en fait, la méthode Read (Byte []) utilise également une boucle pour appeler la méthode read () pour lire dans un tableau d'octet "en même temps", donc essentiellement cette méthode n'utilise pas de tampon de mémoire. Pour utiliser des tampons de mémoire pour améliorer l'efficacité de lecture, nous devons utiliser BufferedInputStream.
3. Stream de caractère
L'unité la plus élémentaire de traitement du flux de caractères en Java est le symbole Unicode (de 2 octets), qui est généralement utilisé pour traiter les données de texte. Le symbole dite Unicode est une unité de code Unicode avec une plage de 0x0000 ~ 0xffff. Chaque nombre dans la plage ci-dessus correspond à un caractère. Le type de chaîne en Java code pour les caractères dans les règles Unicode par défaut, puis les stocke en mémoire. Cependant, contrairement à la mémoire stockée, les données stockées sur le disque ont généralement diverses méthodes de codage. En utilisant différentes méthodes d'encodage, les mêmes caractères auront des représentations binaires différentes. En fait, les flux de personnages fonctionnent comme ceci:
Stream de caractères de sortie: convertissez la séquence de caractères (en fait une séquence de symboles Unicode) en séquence d'octets sous la méthode de codage spécifiée, puis l'écrivez dans le fichier;
Stream de caractères d'entrée: décodez la séquence des octets à lire dans la séquence de caractères correspondante (en fait la séquence de symboles Unicode) dans la méthode de codage spécifiée afin qu'elle puisse être stockée en mémoire.
Nous utilisons une démo pour approfondir notre compréhension de ce processus. L'exemple de code est le suivant:
import java.io.filewriter; import java.io.ioException; public class filewriterDemo {public static void main (String [] args) {filewriter filewriter = null; try {try {filewriter = new FileWriter ("Demo.txt"); filewriter.write ("démo"); } enfin {filewriter.close (); }} catch (ioException e) {e.printStackTrace (); }}}Dans le code ci-dessus, nous utilisons FileWriter pour écrire les quatre caractères "Demo" sur Demo.txt. Nous utilisons l'éditeur hexadécimal Winhex pour afficher le contenu de Demo.txt:
Comme on peut le voir sur la figure ci-dessus, la "démo" que nous avons écrite est codée comme "64 65 6d 6f", mais nous ne spécifions pas explicitement la méthode de codage dans le code ci-dessus. En fait, lorsque nous ne spécifions pas, la méthode de codage de caractères par défaut du système d'exploitation est utilisée pour coder les caractères que nous voulons écrire.
Étant donné que le flux de caractères doit réellement terminer la conversion de la séquence de symboles Unicode à la méthode de codage correspondante avant la sortie, il utilisera un tampon de mémoire pour stocker la séquence d'octets converti et attendre que la conversion soit terminée avant d'écrire dans le fichier de disque ensemble.
4. La différence entre le flux de caractères et le flux d'octet
Après la description ci-dessus, nous pouvons savoir que les principales différences entre les flux d'octets et les flux de caractères se reflètent dans les aspects suivants:
L'unité de base du fonctionnement du flux d'octets est les octets; L'unité de base du fonctionnement du flux de caractères est les symboles Unicode.
Par défaut, le flux d'octets n'utilise pas de tampons; Le flux de caractères utilise des tampons.
Un flux d'octets est généralement utilisé pour traiter les données binaires. En fait, il peut traiter n'importe quel type de données, mais il ne prend pas en charge les symboles d'écriture ou de lecture directement Unicode; Un flux de caractères traite généralement les données texte, qui prend en charge l'écriture et la lecture des symboles Unicode.
Ce qui précède est une partie de ma compréhension des flux de personnages et des flux d'octets en Java. S'il y a des descriptions peu claires ou inexactes, j'espère que vous pourrez les corriger. Merci.