Maison  >  Article  >  Java  >  Introduction détaillée à la différence entre le flux de caractères et le flux d'octets en Java

Introduction détaillée à la différence entre le flux de caractères et le flux d'octets en Java

黄舟
黄舟original
2017-03-25 10:33:322252parcourir

Cet article présente principalement des informations pertinentes qui expliquent la différence entre le flux de caractères et le flux d'octets en Java. Les amis qui en ont besoin peuvent se référer à

La différence entre le flux de caractères et le flux d'octets en Java

1. Qu'est-ce qu'un flux

Un flux en Java est une abstraction d'une séquence d'octets. Nous pouvons imaginer une conduite d'eau, mais maintenant elle coule dans le. conduite d'eau Ce qu'il contient n'est plus de l'eau, mais une séquence d'octets. Comme le flux d'eau, un flux en Java a également une "direction de flux". Un

objet qui peut généralement y lire une séquence d'octets est appelé un flux d'entrée ; un flux d'entrée. L'objet est appelé un flux de sortie.

2. 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 du flux d'octets. La définition de cette méthode est la suivante :

Il s'agit d'une méthode abstraite, ce qui signifie que toute classe de flux d'octets d'entrée dérivée de InputStream doit implémenter cette méthode. La fonction de cette méthode est de lire à partir du flux d'octets un octet, si la fin est atteinte, -1. est renvoyé, sinon l'octet lu est renvoyé. Ce que nous devons noter à propos de cette méthode, c'est qu'elle se bloquera jusqu'à ce qu'elle renvoie un octet lu 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 surchargée de lecture 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 abstract int read() throws IOException;

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

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

De ce qui précède, nous pouvons voyez dans le code que la méthode read(byte[]) lit réellement 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.

   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;
  }

3. 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 le texte. données. 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 font généralement l’objet de 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 : convertit la séquence de caractères à écrire dans le fichier (en fait une séquence d'éléments de code Unicode) en caractères dans l'encodage spécifié séquence d'octets de la méthode, puis écrivez-la dans le fichier
  1. Caractères d'entrée
  2. flux : décode la séquence d'octets à lire dans la séquence de caractères correspondante selon le spécifié méthode d'encodage (en fait une séquence d'éléments de code Unicode) 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 :

Dans le code ci-dessus, nous utilisons FileWriter vers démo Les quatre caractères "demo" sont écrits en .txt Nous utilisons l'éditeur hexadécimal

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();
    }
  }
}
WinHex pour afficher le contenu de demo.txt :

Comme vous pouvez le voir sur l'image ci-dessus, la "démo" que nous avons écrite est codée comme "64 65 6D 6F", mais nous n'avons pas explicitement spécifié la méthode d'encodage dans le code ci-dessus. En fait, elle est utilisée lorsque nous ne le faisons pas. specifier est le codage de caractères par défaut du système d'exploitation pour coder les caractères que nous voulons écrire.

Étant donné que le flux de caractères doit en fait terminer la conversion de la séquence d'éléments de code Unicode en séquence d'octets de la méthode de codage correspondante avant la sortie, il utilisera la mémoire tampon pour stocker la séquence d'octets convertie et attendra après. la conversion est terminée, ils sont écrits ensemble dans le fichier disque.

4. La différence entre le flux de caractères et le flux d'octets

Après la description ci-dessus, nous pouvons savoir que la principale différence entre le flux d'octets et le flux de caractères se reflète dans les aspects suivants :

  • L'unité de base du fonctionnement du flux d'octets est la section de mots. ; l'unité de base des opérations de flux de caractères est l'élément de code Unicode.

  • Les flux d'octets n'utilisent pas de tampons par défaut ; les flux de caractères utilisent des tampons.

  • 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 généralement pas en charge l'écriture ou la lecture directe des éléments de code Unicode ; traite le texte, qui prend en charge l'écriture et la lecture des éléments de code Unicode.

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