この記事では、参照のためにJavaの文字ストリームとバイトストリームの違いを分析します。特定のコンテンツは次のとおりです
1。フローとは
Javaのストリームは、バイトシーケンスの抽象化です。水道管があると想像できますが、今では水道管に流れる水ではなく、バイトシーケンスです。水の流れのように、Javaのストリームには「流れの方向」もあります。バイトのシーケンスを読み取ることができるオブジェクトは、入力ストリームと呼ばれます。バイトのシーケンスが記述されるオブジェクトは、出力ストリームと呼ばれます。
2。バイトストリーム
Javaのバイトストリーム処理の最も基本的な単位は単一のバイトで、通常はバイナリデータの処理に使用されます。 Javaで最も基本的な2つのバイトストリームクラスは、入力ストリームと出力ストリームであり、それぞれ基本的な入力バイトストリームと出力バイトストリームのグループを表します。 inputStreamクラスとoutputStreamクラスの両方は、抽象クラスです。実際に使用すると、通常、Javaクラスライブラリで提供される一連のサブクラスを使用します。 Javaのバイトストリームを紹介するための例として、入力ストリームクラスを使用してみましょう。
inputstreamクラスは、バイトストリームからバイトを読み取るための基本的な方法を定義します。この方法の定義は次のとおりです。
public abstract int read()throws ioException;
これは抽象的な方法です。つまり、この方法を実装するためにInputStreamのニーズから派生した入力バイトストリームクラスです。この方法の機能は、バイトストリームからバイトを読み取り、端に達した場合は-1を返すことです。この方法について注意する必要があるのは、読み取りバイトまたは-1をブロックして返却し続けることです。さらに、バイトストリームはデフォルトでキャッシングをサポートしていません。つまり、読み取りメソッドが呼び出されるたびに、オペレーティングシステムはオペレーティングシステムに1つのバイトを読むように要求します。一部の友人は、パラメーターとしてバイト配列を使用して、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 nullpointerexception(); } else if(off <0 || len <0 || len> b.length -off){新しい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を使用する必要があります。
3。文字ストリーム
Javaの文字ストリーム処理の最も基本的な単位は、単一コードシンボル(サイズが2バイト)で、通常はテキストデータの処理に使用されます。いわゆるUnicodeシンボルは、0x0000〜0xffffの範囲のUnicodeコードユニットです。上記の範囲の各数値は、文字に対応しています。 Javaの文字列タイプは、デフォルトでUnicodeルールの文字をエンコードし、メモリに保存します。ただし、メモリに保存されているのとは異なり、ディスクに保存されているデータには通常、さまざまなエンコード方法があります。異なるエンコーディング方法を使用すると、同じ文字が異なるバイナリ表現を持ちます。実際、キャラクターストリームは次のように機能します:
出力文字ストリーム:文字シーケンス(実際にはユニコードシンボルシーケンス)を指定されたエンコードメソッドの下でバイトシーケンスに変換し、ファイルに書き込みます。
入力文字ストリーム:指定されたエンコードメソッドの対応する文字シーケンス(実際にはユニコードシンボルシーケンス)に読み取るバイトのシーケンスをデコードして、メモリに保存できるようにします。
デモを使用して、このプロセスの理解を深めます。サンプルコードは次のとおりです。
Import java.io.filewriter; import java.io.ioexception; public filewriterdemo {public static void main(string [] args){filewriter filewriter = null; try {try {filewriter = new filewriter( "demo.txt"); filewriter.write( "demo"); }最後に{filewriter.close(); }} catch(ioexception e){e.printstacktrace(); }}}上記のコードでは、FileWriterを使用して、4つの文字「Demo」をDemo.txtに書き込みます。 Demo.txtのコンテンツを表示するには、16進エディターWinHexを使用してください。
上記の図からわかるように、私たちが書いた「デモ」は「64 65 6d 6F」としてエンコードされていますが、上記のコードでエンコードメソッドを明示的に指定していません。実際、指定しない場合、オペレーティングシステムのデフォルト文字エンコードメソッドを使用して、書きたい文字をエンコードします。
文字ストリームは、実際には、出力前に対応するエンコードメソッドへのユニコードシンボルシーケンスの変換を完了する必要があるため、メモリバッファーを使用して変換されたバイトシーケンスを保存し、ディスクファイルに書き込む前にコンバージョンが完了するのを待ちます。
4.文字ストリームとバイトストリームの違い
上記の説明の後、バイトストリームと文字ストリームの主な違いが次の側面に反映されていることがわかります。
バイトストリーム操作の基本単位はバイトです。文字ストリーム操作の基本単位はユニコードシンボルです。
デフォルトでは、バイトストリームはバッファーを使用しません。文字ストリームはバッファーを使用します。
バイトストリームは通常、バイナリデータの処理に使用されます。実際、あらゆるタイプのデータを処理できますが、Unicodeシンボルの書き込みや読み取りを直接サポートしていません。文字ストリームは通常、テキストデータを処理します。テキストデータは、Unicodeシンボルの書き込みと読み取りをサポートします。
上記は、Javaのキャラクターストリームとバイトストリームについての私の理解の一部です。不明確または不正確な説明がある場合は、それらを修正できることを願っています。ありがとう。