ホームページ  >  記事  >  Java  >  Javaの文字ストリームとバイトストリームの違いは何ですか

Javaの文字ストリームとバイトストリームの違いは何ですか

尚
オリジナル
2019-12-02 14:10:144777ブラウズ

Javaの文字ストリームとバイトストリームの違いは何ですか

Java の文字ストリームとバイト ストリームの違い: (推奨: java ビデオ チュートリアル)

1.バイト ストリーム操作の基本単位はバイトであり、文字ストリーム操作の基本単位は Unicode コード要素です。

2. バイト ストリームはデフォルトではバッファを使用しませんが、文字ストリームはバッファを使用します。

3. バイト ストリームは通常、バイナリ データの処理に使用されます。実際、あらゆるタイプのデータを処理できますが、Unicode コード要素の直接の書き込みや読み取りはサポートされていません。文字ストリームは通常、テキスト データを処理します。 Unicode コード単位の書き込みと読み取りをサポートします。

バイト ストリーム

Java におけるバイト ストリーム処理の最も基本的な単位は 1 バイトであり、通常はバイナリ データの処理に使用されます。 Java の 2 つの最も基本的なバイト ストリーム クラスは、InputStream と OutputStream で、それぞれ基本的な入力バイト ストリームと出力バイト ストリームを表します。

InputStream クラスと OutputStream クラスはどちらも抽象クラスであり、実際に使用する場合には、通常、Java クラス ライブラリで提供されている一連のサブクラスを使用します。 Java のバイト ストリームを紹介するために、InputStream クラスを例に挙げてみましょう。

InputStream クラスは、バイト ストリームからバイトを読み取るための基本メソッド read を定義します。このメソッドの定義は次のとおりです:

public abstract int read() throws IOException;

これは抽象メソッドです。つまり、任意の入力バイト ストリームです。 InputStream から派生したクラスは、このメソッドを実装する必要があります。このメソッドの機能は、バイト ストリームからバイトを読み取ることです。最後に到達した場合は -1 を返し、そうでない場合は読み取ったバイトを返します。

このメソッドについて注意する必要があるのは、読み取りバイトまたは -1 を返すまでブロックされるということです。さらに、バイト ストリームはデフォルトではキャッシュをサポートしていません。つまり、読み取りメソッドが呼び出されるたびに、オペレーティング システムはバイトの読み取りを要求され、多くの場合ディスク IO が伴うため、効率は比較的低くなります。

友人の中には、バイト配列をパラメーターとして受け取る、InputStream クラスの読み取りのオーバーロードされたメソッドは、頻繁なディスク IO を行わずに一度に複数バイトを読み取ることができると考える人もいるかもしれません。では、これは本当にそうなのでしょうか?このメソッドのソース コードを見てみましょう:

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

これは別のバージョンの読み取りオーバーロード メソッドを呼び出します。したがって、フォローアップしてみましょう:

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

上記のコードから、はい、ということがわかります。実際、read(byte[]) メソッドも、ループ内で read() メソッドを呼び出すことによってバイト配列を「一度に」読み取るため、基本的にこのメソッドはメモリ バッファを使用しません。メモリ バッファを使用して読み取り効率を向上するには、BufferedInputStream を使用する必要があります。

文字ストリーム

Java における文字ストリーム処理の最も基本的な単位は Unicode コード要素 (サイズ 2 バイト) で、通常はテキスト データの処理に使用されます。いわゆる Unicode コード要素は、0x0000 ~ 0xFFFF の範囲の Unicode コード単位です。上記の範囲の各数値は 1 つの文字に対応します。Java の String 型は、デフォルトで Unicode 規則に従って文字をエンコードし、メモリに格納します。

ただし、メモリ内のストレージとは異なり、ディスクに保存されたデータには通常、さまざまなエンコード方式が使用されます。異なるエンコード方法を使用すると、同じ文字でも異なるバイナリ表現になります。実際、文字ストリームは次のように動作します。

出力文字ストリーム: ファイルに書き込まれる文字シーケンス (実際には Unicode コード要素シーケンス) を、指定されたエンコード方式でバイト シーケンスに変換します。ファイルに書き込む;

入力文字ストリーム: 指定されたエンコード方式に従って、読み込まれるバイト シーケンスを対応する文字シーケンス (実際には Unicode コード要素シーケンス) にデコードして、ファイルに格納できるようにします。メモリ。

このプロセスの理解を深めるためにデモを使用します。サンプル コードは次のとおりです:

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

Java の詳細については、Java 基本チュートリアル##を参照してください。 # カラム。

以上がJavaの文字ストリームとバイトストリームの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。