Heim  >  Artikel  >  Java  >  Detaillierte Einführung in den Unterschied zwischen Zeichenstrom und Bytestrom in Java

Detaillierte Einführung in den Unterschied zwischen Zeichenstrom und Bytestrom in Java

黄舟
黄舟Original
2017-03-25 10:33:322252Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen vorgestellt, die den Unterschied zwischen Zeichenstrom und Bytestrom in Java erklären. Freunde, die sie benötigen, können sich auf

Der Unterschied zwischen Zeichenstrom und Bytestrom in Java

1. Was ist ein Stream?

Ein Stream in Java ist eine Abstraktion einer Bytesequenz, aber jetzt fließt er in Wasserpfeife Darin ist kein Wasser mehr, sondern eine Folge von Bytes. Wie der Wasserfluss hat auch ein Stream in Java eine „Flussrichtung“. Ein

-Objekt , das normalerweise eine Bytesequenz daraus lesen kann, wird als Eingabestream bezeichnet ein Eingabestream. Das Objekt wird als Ausgabestream bezeichnet.

2. Byte-Stream

Die grundlegendste Einheit der Byte-Stream-Verarbeitung in Java ist ein einzelnes Byte, das normalerweise zur Verarbeitung von Binärdaten verwendet wird. Die beiden grundlegendsten Bytestream-Klassen in Java sind InputStream und OutputStream, die den grundlegenden Eingabebytestream bzw. Ausgabebytestream darstellen. Sowohl die InputStream-Klasse als auch die OutputStream-Klasse sind

abstrakte Klassen. Bei der tatsächlichen Verwendung verwenden wir normalerweise eine Reihe ihrer Unterklassen, die in der JavaKlassenbibliothek bereitgestellt werden. Nehmen wir die InputStream-Klasse als Beispiel, um den Byte-Stream in Java einzuführen

Die InputStream-Klasse definiert eine grundlegende Lesemethode zum Lesen von Bytes aus dem Byte-Stream. Die Definition dieser Methode lautet wie folgt:

public abstract int read() throws IOException;
Dies ist eine abstrakte Methode, was bedeutet, dass jede von InputStream abgeleitete Eingabebyte-Stream-Klasse diese Methode implementieren muss. Die Funktion dieser Methode besteht darin, ein Byte aus dem Byte-Stream zu lesen, wenn das Ende erreicht ist, -1 zurückgegeben, andernfalls wird das gelesene Byte zurückgegeben. Was wir bei dieser Methode beachten müssen, ist, dass sie blockiert, bis sie ein gelesenes Byte oder -1 zurückgibt. Darüber hinaus unterstützen Byte-Streams standardmäßig kein Caching, was bedeutet, dass das Betriebssystem bei jedem Aufruf der Lesemethode aufgefordert wird, ein Byte zu lesen, was häufig mit einer Festplatten-E/A einhergeht, sodass die Effizienz relativ gering ist. Einige Freunde denken vielleicht, dass die überladene Lesemethode in der InputStream-Klasse, die ein Byte-Array als Parameter verwendet, mehrere Bytes gleichzeitig ohne häufige Festplatten-E/A lesen kann. Ist das also wirklich so? Werfen wir einen Blick auf den Quellcode dieser Methode:

public int read(byte b[]) throws IOException {
  return read(b, 0, b.length);
}
Es ruft eine andere Version der Read-Overload-Methode auf, also machen wir weiter:

   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;
  }
Aus dem oben Gesagten können wir Aus dem Code geht hervor, dass die Methode read(byte[]) tatsächlich ein Byte-Array „nacheinander“ liest, indem sie die Methode read() in einer Schleife aufruft, sodass diese Methode im Wesentlichen nicht den Speicherpuffer verwendet. Um einen Speicherpuffer zur Verbesserung der Leseeffizienz zu verwenden, sollten wir BufferedInputStream verwenden.

3. Zeichenstrom

Die grundlegendste Einheit der Zeichenstromverarbeitung in Java ist die Unicode-Codeeinheit (Größe 2 Bytes), die normalerweise zur Textverarbeitung verwendet wird Daten. Das sogenannte Unicode-Codeelement ist eine Unicode-Codeeinheit im Bereich von 0x0000 bis 0xFFFF. Jede Zahl im obigen Bereich entspricht einem Zeichen. Der Typ

String in Java codiert Zeichen standardmäßig gemäß den Unicode-Regeln und speichert sie dann im Speicher. Im Gegensatz zur Speicherung im Arbeitsspeicher verfügen Daten, die auf der Festplatte gespeichert werden, jedoch in der Regel über verschiedene Kodierungsmethoden. Bei Verwendung unterschiedlicher Codierungsmethoden haben dieselben Zeichen unterschiedliche binäre Darstellungen. Tatsächlich funktioniert der Zeichenstrom so:

  1. Ausgabezeichenstrom: Konvertieren Sie die in die Datei zu schreibende Zeichenfolge (eigentlich eine Unicode-Codeelementsequenz) in Zeichen in der angegebenen Codierung Methode Byte-Sequenz, und schreiben Sie sie dann in die Datei

  2. Eingabezeichen Stream: Dekodieren Sie die zu lesende Byte-Sequenz in die entsprechende Zeichenfolge gemäß den angegebenen Codierungsmethode (eigentlich eine Folge von Unicode-Codeelementen), damit sie im Speicher gespeichert werden kann.

Wir verwenden eine Demo, um unser Verständnis dieses Prozesses zu vertiefen. Der Beispielcode lautet wie folgt:

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();
    }
  }
}
Im obigen Code verwenden wir FileWriter zur Demo Die vier Zeichen „demo“ werden in .txt geschrieben. Wir verwenden den hexadezimalen

Editor WinHex, um den Inhalt von demo.txt anzuzeigen:

Wie Sie auf dem Bild oben sehen können, ist die von uns geschriebene „Demo“ als „64 65 6D 6F“ codiert, aber wir haben die Codierungsmethode im obigen Code nicht explizit angegeben. Tatsächlich wird sie verwendet, wenn wir dies nicht tun Spezifizieren ist die Standardzeichenkodierung des Betriebssystems zum Kodieren der Zeichen, die wir schreiben möchten.

Da der Zeichenstrom vor der Ausgabe tatsächlich die Konvertierung der Unicode-Codeelementsequenz in die Bytesequenz der entsprechenden Codierungsmethode abschließen muss, verwendet er den Speicherpuffer zum Speichern der konvertierten Bytesequenz und wartet danach Wenn die Konvertierung abgeschlossen ist, werden sie zusammen auf die Festplattendatei geschrieben.

4. Der Unterschied zwischen Zeichenstrom und Bytestrom

Nach der obigen Beschreibung können wir erkennen, dass sich der Hauptunterschied zwischen Byte-Stream und Zeichen-Stream in den folgenden Aspekten widerspiegelt:

  • Die Grundeinheit der Byte-Stream-Operation ist der Wortabschnitt ; Die Grundeinheit von Zeichenstromoperationen ist das Unicode-Codeelement.

  • Byte-Streams verwenden standardmäßig keine Puffer;

  • Byte-Stream wird normalerweise zur Verarbeitung von Binärdaten verwendet. Tatsächlich kann er jede Art von Daten verarbeiten, unterstützt jedoch normalerweise kein direktes Schreiben oder Lesen von Unicode-Code-Elementen verarbeitet Text, der das Schreiben und Lesen von Unicode-Codeelementen unterstützt.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Unterschied zwischen Zeichenstrom und Bytestrom in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn