バイトストリームと文字ストリームの違いと相互変換

21839 ワード

まず、ストリームの概念を見てみましょう.
     プログラム内のすべてのデータはストリームで転送または保存され、プログラムがデータを必要とする場合は入力ストリームを使用してデータを読み出し、プログラムがデータを保存する必要がある場合は出力ストリームを使用して完了します.
     プログラムの入出力はすべてストリームの形式で保存され、ストリームに保存されているのは実際にはすべてバイトファイルです.
バイトストリームと文字ストリーム
     Java.ioパッケージでファイルの内容を操作する主なクラスは、バイトストリーム、文字ストリームの2つで、入力操作と出力操作に分けられます.バイトストリームにおける出力データは主にOutputStreamを用いて完了し,入力はInputStream,文字ストリームにおける出力は主にWriterクラスを用いて完了し,入力ストリームは主にReaderクラスを用いて完了する.(この4つは抽象クラスです)
     JAvaには、次のような入出力機能専用のパッケージJava.ioが用意されています.     InputStream,OutputStream,Reader,Writer     InputStreamとOutputStreamは、主にバイトまたはバイナリオブジェクトの処理に使用されるバイトストリームのために設計されています.     ReaderとWriter.は、文字ストリーム(1文字が2バイトを占める)のために設計され、主に文字や文字列を処理するために使用される.
     文字ストリーム処理ユニットは2バイトのUnicode文字で、それぞれ文字、文字配列または文字列を操作し、バイトストリーム処理ユニットは1バイト、操作バイトおよびバイト配列である.したがって、文字ストリームはJava仮想マシンがバイトを2バイトのUnicode文字単位の文字に変換したものなので、多言語のサポート性に優れています.オーディオファイル、画像、曲ならバイトで流し、中国語(テキスト)にかかわるなら文字で流したほうがいい     すべてのファイルの格納はバイト(byte)の格納であり、ディスクに格納されるのはファイルの文字ではなく、文字をバイトに符号化してから、これらのバイトをディスクに格納します.ファイル(特にテキストファイル)を読み取る場合も、バイトシーケンスを形成するために1バイトずつ読み取る
      バイトストリームは、バイナリオブジェクトを含む任意のタイプのオブジェクトに使用できますが、文字ストリームは文字または文字列しか処理できません.バイトストリームは、任意のタイプのIO操作を処理する機能を提供しますが、Unicode文字を直接処理することはできません.文字ストリームは     バイトストリームは最も基本的で、すべてのInputStremとOutputStreamのサブクラスは、主にバイナリデータを処理するために使用され、バイトで処理されていますが、実際には多くのデータがテキストであり、仮想マシンのencodeで処理される文字ストリームの概念を提案しています.つまり、文字セットの変換を行う2つの間にInputStreamReaderを通じて、OutputStreamWriterによる関連付けは,実際にbyte[]とStringによる関連付けによって実際に開発された漢字問題が実際には文字ストリームとバイトストリームの間で変換が不統一になったためである.
     バイトストリームと文字ストリームの操作手順:   
     ファイル操作を例にとると、主な操作の流れは以下の通りです.
    1 Fileクラスを使用してファイルを開く
    2 バイトストリームまたは文字ストリームのサブクラスにより、出力の場所を指定します.
    3 読み取り/書き込み操作を行う
    4 入出力を閉じる
     IO操作はリソース操作に属するので、必ず閉じることを覚えておいてください. 
     バイトフローのアクション:
     バイトストリームは主に操作byte型データでありbyte配列に準じており,主な操作クラスはOutputStream,InputStreamである.     
     バイト出力ストリーム:Output Stream
OutputStreamは、IOパケット全体のバイト出力ストリームの最大親です.この定義は次のとおりです.
public abstract class OutputStream extends Object implements Closeable,Flushable

以上の定義から、このクラスは抽象的なクラスであり、このクラスを使用する場合は、まずサブクラスでオブジェクトをインスタンス化する必要があります.これからファイルを操作する場合は、FileOutputStreamクラスを使用できます.アップコンバートによりOutputStreamをインスタンス化
Closeableは、プログラムが最後まで実行されると必ず閉じるため、閉じることができる操作を示します.
Flushable:リフレッシュ、メモリ内のデータのクリア
FileOutputStreamクラスの構築方法は次のとおりです.
public FileOutputStream(File file)throws FileNotFoundException

 
書き込みデータ:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Test11 {
      public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          OutputStream out=new FileOutputStream(f);//            
         String str="Hello World";
         byte[] b=str.getBytes();
         out.write(b);//
         out.close();
     }
 }

               ,  :

 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
 public class Test11 {
      public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          OutputStream out=new FileOutputStream(f);//            
         String str="Hello World";
         byte[] b=str.getBytes();
         for(int i=0;i){
             out.write(b[i]);
         }
         out.close();
     }
 }

以上の出力は上書きのみとなりますが、追加する場合は、FileOutputStreamクラスのもう一つの構造方法をご覧ください.
public FileOutputStream(File file,boolean append)throws FileNotFoundException

構築方法では、appendの値をtrueに設定すると、ファイルの末尾にコンテンツを追加することを示します.
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
 
 public class Test11 {
      public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          OutputStream out=new FileOutputStream(f,true);//    
         String str="\r
Hello World"; byte[] b=str.getBytes(); for(int i=0;i){ out.write(b[i]); } out.close(); } }

バイト入力ストリーム:InputStream
プログラムがファイルにコンテンツを書き込むことができる以上、InputStreamを介してファイルからコンテンツを読み込むことができます.まず、InputStreamクラスの定義を見てみましょう.
      public abstract class InputStream extends Object implements Closeable
OutputStreamクラスと同様、InputStream自体も抽象クラスであり、そのサブクラスに依存しなければならず、現在ファイルから読み込まれている場合はFileInputStreamで実現される.
FileInputStreamクラスの構築方法を観察します.
      public FileInputStream(File file)throws FileNotFoundException
ファイルの読み込み:
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
  public class Test12 {
      public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          InputStream in=new FileInputStream(f);
         byte[] b=new byte[(int) f.length()];  //                 int len=in.read(b);
         in.close();
         System.out.println(new String(b,0,len));
     }
 }

別の方法では、1バイトずつ読み込みます.
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
  public class Test14 {
      public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          InputStream in=new FileInputStream(f);
         byte[] b=new byte[(int) f.length()];
         for(int i=0;i){
             b[i]=(byte) in.read();
         }
         in.close();
         System.out.println(new String(b));
     }
 }

ただし、上記の場合は入力ファイルの大きさを知るのに適しており、知らない場合は以下の方法で行います.
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
  public class Test15 {
      public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          InputStream in=new FileInputStream(f);
         byte[] b=new byte[1024];
         int temp=0;
         int len=0;
         while((temp=in.read())!=-1){//-1        
             b[len]=(byte) temp;
             len++;
        }
         in.close();
         System.out.println(new String(b,0,len));
     }
 }

文字ストリーム
プログラム内の1文字が2バイトに等しい場合、javaはReader、Writerの2つの専門的な文字ストリームを操作するクラスを提供します.
文字出力ストリームもじしゅつりょくりゅー:Writer Writer Writer
Writer自体は文字ストリームの出力クラスであり、次のように定義されています.
     public abstract class Writer extends Object implements Appendable,Closeable,Flushable
このクラス自体も抽象的なクラスですが、このクラスを使用する場合は必ずそのサブクラスを使用します.この場合、ファイルにコンテンツを書き込む場合はFileWriterのサブクラスを使用する必要があります.
FileWriterクラスの構築方法は次のように定義されます.
     public FileWriter(File file)throws IOException
文字ストリームの操作はバイトストリームの操作よりも優れており、文字列を直接出力することができ、以前のように変換操作を行う必要はありません.
ファイルの書き込み:
import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.Writer;
 
  public class Test16 {
      public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          Writer out=new FileWriter(f);
         String str="Hello World";
         out.write(str);
         out.close();
     }
 }

             ,                   

import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.Writer;
 
  public class Test17 {
     public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          Writer out=new FileWriter(f,true);//  
         String str="\r
Hello World"; out.write(str); out.close(); } }

文字入力フロー:Reader
Readerは文字を使用してファイルからデータを取り出します.Readerクラスの定義は次のとおりです.
    public abstract class Reader extends Objects implements Readable,Closeable
Reader自体も抽象クラスで、ファイルからコンテンツを読み込む場合はFileReaderサブクラスを直接使用できます.
FileReaderの構築方法は次のように定義されます.
    public FileReader(File file)throws FileNotFoundException
データを文字配列で読み込みます.
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.Reader;
 
  public class Test18 {
      public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          Reader input=new FileReader(f);
         char[] c=new char[1024];
         int len=input.read(c);
         input.close();
         System.out.println(new String(c,0,len));
     }
 }

        ,       

import java.io.File;
import java.io.FileReader;
 import java.io.IOException;
 import java.io.Reader;

 public class Test19 {
     public static void main(String[] args) throws IOException {
          File f = new File("d:" + File.separator+"test.txt");
          Reader input=new FileReader(f);
         char[] c=new char[1024];
         int temp=0;
         int len=0;
         while((temp=input.read())!=-1){
             c[len]=(char) temp;
             len++;
         }
         input.close();
         System.out.println(new String(c,0,len));
     }
 }

バイトストリームと文字ストリームの違い
バイトストリームと文字ストリームの使用は非常に似ていますが、操作コードの違い以外にどのような違いがありますか?
バイトストリームは、操作時にバッファ(メモリ)が使用されず、ファイル自体と直接操作され、文字ストリームは操作時にバッファに使用されます.
バイトストリームは、ファイルを操作する際に、リソース(closeメソッド)をオフにしなくてもファイルは出力できますが、文字ストリームがcloseメソッドを使用しない場合、何も出力されません.文字ストリームがバッファであることを示し、flushメソッドを使用して新しいバッファを強制的にブラシすることができます.この場合、closeなしでコンテンツを出力できます.
では、開発ではバイトストリームがいいのか、文字ストリームがいいのか.
すべてのハードディスク(HDD)にファイルを保存したり、転送したりするときはバイトの方法で行われます.画像も含めてバイトで完了しますが、文字はメモリにしか形成されませんので、バイトを使用する操作が最も多いです.
Javaプログラムがコピー機能を実装する場合は、バイトストリームを選択して操作し(画像をコピーする可能性があります)、読み取りながら書く方法(メモリを節約します).
バイトストリームと文字ストリームの変換
     Javaはバイトストリームと文字ストリームをサポートしますが、バイトストリームと文字ストリームの両方を変換する必要がある場合があります.InputStreamReaderとOutputStreamWriterの2つのクラスは、バイトストリームと文字ストリームの間で相互に変換されるクラスです.
InputSreamReaderは、1バイトストリームのバイトを文字に復号するために使用されます.
2つの構造方法があります.
    InputStreamReader(InputStream in);
機能:デフォルト文字セットでInputStreamReaderオブジェクトを作成する
    InputStreamReader(InputStream in,String CharsetName);
機能:指定した文字セット名の文字列を受信し、その文字でオブジェクトを作成します.
OutputStreamは、書き込まれた文字をバイトに符号化して1バイトストリームに書き込むために使用されます.
同様に2つの構造方法があります.
    OutputStreamWriter(OutputStream out);
機能:既定の文字セットでOutputStreamWriterオブジェクトを作成します.
    OutputStreamWriter(OutputStream out,String  CharSetName);
機能:指定した文字セット名の文字列を受け取り、その文字セットでOutputStreamWriteオブジェクトを作成します.
      バイトストリームと文字ストリームの頻繁な変換を避けるために,以上の2つのクラスをカプセル化した.
BufferedWriterクラスはOutputStreamWriterクラスをカプセル化している.
BufferedReaderクラスはInputStreamReaderクラスをカプセル化している.
パッケージ形式:
  BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out));
  BufferedReader in= new BufferedReader(new InputStreamReader(System.in);
次の文を使用して、コンソールから1行の文字列を読み込むことができます.
  BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
  String line=in.readLine();
転載先:https://www.cnblogs.com/sjjsh/p/5269781.html