Maison >Java >JavaBase >Quelle est la différence entre le flux de caractères Java et le flux d'octets

Quelle est la différence entre le flux de caractères Java et le flux d'octets

尚
original
2019-12-02 14:10:144887parcourir

Quelle est la différence entre le flux de caractères Java et le flux d'octets

La différence entre le flux de caractères et le flux d'octets en Java : (recommandé : tutoriel vidéo Java)

1. L'unité de base des opérations de flux d'octets est l'octet ; l'unité de base des opérations de flux de caractères est l'élément de code Unicode.

2. Le flux d'octets n'utilise pas de tampon par défaut ; le flux de caractères utilise un tampon.

3. Le flux d'octets est généralement utilisé pour traiter des données binaires. En fait, il peut traiter tout type de données, mais il ne prend pas en charge l'écriture ou la lecture directe des éléments de code Unicode. qui prend en charge l'écriture et la lecture des unités de code Unicode.

Flux d'octets

L'unité la plus basique du traitement du flux d'octets en Java est un seul octet, qui est généralement utilisé pour traiter les données binaires. Les deux classes de flux d'octets les plus élémentaires en Java sont InputStream et OutputStream, qui représentent respectivement le flux d'octets d'entrée de base et le flux d'octets de sortie.

La classe InputStream et la classe OutputStream sont des classes abstraites. En utilisation réelle, nous utilisons généralement une série de leurs sous-classes fournies dans la bibliothèque de classes 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 read pour lire les octets d'un flux d'octets. La définition de cette méthode est la suivante :

public abstract int read() throws IOException;

Il s'agit d'une méthode abstraite, c'est-à-dire n'importe quel flux d'octets d'entrée. La classe dérivée de InputStream doit implémenter cette méthode. La fonction de cette méthode est de lire un octet du flux d'octets. Si elle atteint la fin, elle renvoie -1, sinon elle renvoie l'octet lu.

Ce que nous devons noter à propos de cette méthode, c'est qu'elle se bloquera jusqu'à ce qu'elle renvoie 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 est invité à lire un octet, qui est souvent accompagné d'une E/S disque, donc l'efficacité est relativement faible.

Certains amis peuvent penser que la méthode de lecture surchargée dans la classe InputStream qui prend un tableau d'octets comme paramètre peut lire plusieurs octets à la fois sans E/S disque fréquentes. Alors est-ce vraiment le cas ? Jetons un coup d'œil au code source de cette méthode :

public int read(byte b[]) throws IOException {
    return read(b, 0, b.length);
}

Elle appelle une autre version de la méthode de surcharge de lecture, suivons donc :

public int read(byte b[], int off, int len) throws IOException {
        if (b == null) {
            throw 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;
        try {
            for (; 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 Oui, en fait, la méthode read(byte[]) lit également un tableau d'octets "à la fois" en appelant la méthode read() dans une boucle, donc essentiellement cette méthode n'utilise pas la mémoire tampon. Pour utiliser une mémoire tampon afin d'améliorer l'efficacité de la lecture, nous devons utiliser BufferedInputStream.

Flux de caractères

L'unité la plus basique du traitement du flux de caractères en Java est l'unité de code Unicode (taille 2 octets), qui est généralement utilisée pour traiter les données texte. L'élément de code Unicode est une unité de code Unicode, allant de 0x0000 à 0xFFFF. Chaque nombre de la plage ci-dessus correspond à un caractère. Le type String en Java encode les caractères selon les règles Unicode par défaut, puis les stocke en mémoire.

Cependant, contrairement au stockage en mémoire, les données stockées sur disque ont généralement diverses méthodes de codage. En utilisant différentes méthodes de codage, les mêmes caractères auront des représentations binaires différentes. En fait, le flux de caractères fonctionne comme ceci :

Flux de caractères de sortie : convertissez la séquence de caractères à écrire dans le fichier (en fait une séquence d'éléments de code Unicode) en une séquence d'octets dans la méthode de codage spécifiée, puis écrire dans le fichier ;

Flux de caractères d'entrée : décode la séquence d'octets à lire dans la séquence de caractères correspondante (en fait une séquence d'éléments de code Unicode) selon la méthode de codage spécifiée, afin qu'elle puisse être stockée dans le fichier. 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("demo");
            } finally {
                fileWriter.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Pour plus de connaissances sur Java, veuillez prêter attention au tutoriel de base Java colonne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn