Heim >Java >javaLernprogramm >Detaillierte Einführung in den Unterschied zwischen Zeichenstrom und Bytestrom in Java
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“. Ein2. 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 sindabstrakte 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 Typimport 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!