Javaバイトストリームと文字ストリームの違いを理解します

フローとは何ですか

ストリーム内のJavaは、バイトの抽象シーケンス、我々は水道管があり想像することはできませんが、今水はもはや水に流れているが、バイトのシーケンス。出力ストリーム・オブジェクトと呼ばれるバイトのシーケンスに書き込みすることができ、及び水など、Javaは、オブジェクトが通常呼ばれる入力ストリームにバイトのシーケンスから読み取ることができる、「流れの方向」に流れを持っています。

バイトストリーム

単一バイトで処理Javaバイトストリームの基本単位は、通常はバイナリデータで使用されています。基本スロットル単語内のJavaクラスは、バイトの最も基本的な入力バイトストリームと出力ストリームを表したInputStreamとOutputStreamの、です。InputStreamクラスとOutputStreamのクラスは抽象クラスである、我々は通常、実際の使用に設けられたサブ・クラスのJavaクラスライブラリのシリーズでそれらを使用しています。ここでは、Javaの下でバイトストリームを導入するために、例えば、クラスのInputStream。入力ストリームクラスは、次のように、この方法が定義され、バイト・ストリーム・リードからバイトを読み取るための基本的な方法を定義します。

パブリック 抽象 INTは()読みスロー IOExceptionが。

 これは、このアプローチを実装するために、入力バイトストリーム入力ストリームクラスのニーズのいずれかから誘導された抽象メソッドであり、このアプローチの有用性は、エンド場合又は-1に、バイトストリームからバイトを読み出すことですそれ以外のバイトをお読みください。この方法については、我々はバイトまたは-1の読み取りに戻るために知ってブロックされていたであろうことに注意する必要があります。また、デフォルトではバイトストリームは、それぞれの方法は、多くの場合、ディスクIOを伴っているバイトを読み取るために、オペレーティング・システムへの読み取り要求後に呼び出されることを意味し、キャッシングをサポートしていないので、効率が低くなります。いくつかは、小さなパートナーは、パラメータとしてクラスInputStreamのバイト配列に読み込むためのメソッドをオーバーロードしていることと思うかもしれ代わりに頻繁にディスクIOのバイト数で読み取ることができます。だから何ではないのですか?このメソッドのソースコードを見てみましょう:

公共 intは読み取り(バイト B [])スローのIOException {
   リターンリード(B、0 、てb.length)。
}

これは、リードオーバーロードされたメソッドの別のバージョンを呼び出して、我々はその後、追いかけるます。

公共 int型リード(バイト B []、int型、オフINT LEN)スローのIOException {
   場合(B == NULL ){
     スロー 新しいNullPointerExceptionが()。
  } そう であれば(<0 || LEN <0 || LEN>てb.lengthオフ- オフ){ 
     スロー 新しいはIndexOutOfBoundsException()。
  } そう であれば(LEN == 0 ){ 
     戻り 0 
  } 
  int型の C = (読み取り) 
  もし(C == -1 ){ 
     リターン-1 ; 
  } 
  B [OFF] =(バイト)C。 
  int型私は1を= 試す{ 
     ため(++ I; I <lenの){ 
      C = 読み取ります()。 
      もし(C == -1 ){ 
         ブレーク
      } 
      B [OFF + I] =(バイト)C。
    } 
  } キャッチ(IOExceptionをeeで){} 
   を返す私は、
}

我々は、この方法は、本質的に読み出し()メソッドの呼び出しによって、未使用のメモリ・サイクルであるように、バイト配列を読み取り、実際に内部(バイト[])メソッドは、読み出し「1」を介して実装され、コードを見ることができ、上記からバッファ。読書の効率を改善するために、メモリバッファを使用するには、我々はBufferedInputStreamをを使用する必要があります。

文字ストリーム

基本的な文字ストリーム処理部は、Java Unicodeの記号(サイズ2バイト)で、それはテキストデータを処理するために通常です。いわゆるユニコードシンボル、すなわちA Unicodeコード単位、0000〜0xFFFFの範囲です。各番号は、メモリに格納されているデフォルトのUnicode符号化規則を配置する文字の文字、JavaのString型に上記範囲内にある対応します。しかし、メモリに格納された異なるが、ディスク上に格納されたデータは、通常、符号化の様々な構造を有します。異なる符号化方式を使用して、同じ文字が異なるバイナリ表現を持っています。実際には文字ストリームは、次のように動作します。

  • 出力文字ストリーム:文字のシーケンスが符号化に指定し、ファイルに書き込まれたバイトの配列にファイル(実際にはユニコードシンボル系列)に書き込まれます。
  • 入力文字ストリーム:バイトシーケンスが読み取られる符号化モード復号化は、文字の対応する配列(実際にはUnicodeのシンボル系列)をメモリに記憶することができるによって指定されます。

次のようにデモ、サンプルコードを通じて、このプロセスの理解を深めるには:

パブリック クラスFileWriterDemo { 
   公共 静的 ボイドメイン(文字列[]引数){ 
    てFileWriterてFileWriter = NULL ; 
    試す{ 
       試み{ 
        てFileWriter = 新しいてFileWriter( "demo.txt" ); 
        fileWriter.write( "デモ" ); 
      } 最後に{ 
        fileWriter.close()。
      } 
    } キャッチ(IOExceptionを電子){ 
       e.printStackTrace(); 
    } 
  } 
}

 

上記のコードは、私たちがしてFileWriterを使用して、我々はdemo.txtの下でバイナリエディタWinHexの外観を使用し、demo.txtに4文字の「デモ」を書き込みます。

図からわかるように、私たちは、「デモ」は「64 65 6D 6F」にコード化された書き込みが、私たちは、明示的に我々が指定されていない使用実際に、上記のコードでエンコーディングを指定しません私たちが書きたい文字をエンコードするためにエンコードするオペレーティングシステムのデフォルトの文字。
出力文字ストリームので、実際にはバイトの変換されたシーケンスを記憶するためにメモリバッファを使用するので、Unicodeのシンボル系列は、符号化モード変換バイトシーケンスに対応する完了する前に、その後一緒に書かれている変換の完了を待ちますディスクファイルに。

バイトストリームと文字ストリームの違い

上記の説明の後、我々は以下の分野で具体バイトストリームと文字ストリームの主な違いを知ることができます。

  • ベースユニットバイトストリーム操作(読み出しおよび書き込み)バイトであり、文字列操作Unicodeのシンボルの基本単位です。
  • デフォルトのバイトストリームバッファで使用されるわけではありません。文字ストリームバッファが使用されています。
  • バイトは、一般的にバイナリデータを処理するために使用され、実際には、それはあらゆる種類のデータを扱うことができるが、それは直接書き込みをサポートしたり、Unicodeの記号を読んでいないストリームを、通常の処理テキスト文字データ・ストリーム、書き込みをサポートしているし、Unicodeの記号を読んで。
  • ただ、ファイル、ファイルの内容、および関係のない、通常は選択されたバイトストリームを読み取りおよび書き込み。

シーンを使用して、バイトストリーム

バイトストリームファイルデータ伝送のすべてのタイプに適した、通常の状況下でACSIIコードがバイトを格納するための空間であるため、コンピュータのバイト(バイト)は、コンピュータを表す情報を意味する最小単位であるためです。

文字ストリームの使用シナリオ

文字ストリームは、プレーンテキストデータ(テキストファイル)、データのない他のタイプが、便利なように、テキスト処理テキストをストリーミングバイトストリームよりも文字を扱うことができます。

文字による文字は、データストリームを読み取る2つのバイト文字に対応するint値(コード)を返し、2つのバイトを読み取ります。これらの2バイトのファイルの内容に書き込む場合はUnicodeで書かれている文字コードに対応するバイナリデータに復号されます。すなわち、原稿のバイナリデータは、文字の形で読み込まれ、その後の文字は、結果として得られるファイルは、文字モードで記憶されているように、バイナリ形式で記述されています。画像データを使用すると、画像を開いたときに間違ってデコード、バイトとして格納されています!バイトストリームデータバイトが読み:バイトとノーコーディング、デコード、必要性だけバイト文字エンコーディングの間の変換場合、デコード!画像データが正常に読み取ることができます。

オリジナルリンク:www.jianshu.com

おすすめ

転載: www.cnblogs.com/isxiaoming/p/12397850.html