Java IO学習ノート(バイトストリーム)


バイトストリームは最も基本的なストリームであり、ファイルの操作、ネットワークデータの転送などはバイトストリームに依存する.一方、文字ストリームは、テキストタイプのデータや文字ストリームを読み出す操作などに使用されることが多い.
バイトストリームのAPIについては、何も言うことはありませんが、見てみればわかります.ここでは、いくつかのキーを選択します.
一、InputStreamのAPI
1、public int read()
入力ストリームから次のデータバイトを読み出します.0~255の範囲のintバイト値を返します.ストリームの最後に到達したために使用可能なバイトがない場合は、値-1を返します.
2、public int read(byte[] b)
入力ストリームから一定数のバイトを読み出し、バッファ配列bに格納する.実際に読み込まれたバイト数を整数で返します.ストリームがファイルの最後にあるため、使用可能なバイトがない場合は、値-1を返します.そうでなければ、少なくとも1バイトを読み出し、bに格納することができる.この方法はread(b,0,b.length)に等しい
3、public int read(byte[] b, int off, int len)
入力ストリームの最大len個のデータバイトをバイト配列に読み込む.最大lenバイトの読み取りを試みますが、読み取り数が少ない場合があります.実際に読み込まれたバイト数を整数で返します.ストリームの最後に達したためにデータがなくなった場合は、-1を返します.
パラメータ:
b-データを読み込むバッファ.
off-データが書き込まれる配列bの初期オフセット量.
len-読み込む最大バイト数.
二、OutputStreamのAPI
1、public void write(int b)
指定したバイトをこの出力ストリームに書き込みます.writeの通常の協定は、出力ストリームに1バイトを書き込むことです.書き込むバイトは、パラメータbの8つの下位ビットである.bの24個の高位は無視されます.
2、public void write(byte[] b)
b.lengthバイトを指定したバイト配列からこの出力ストリームに書き込む.write(b)の通常の協定は、write(b,0,b.length)を呼び出す効果と完全に同じであるべきである.
3、public void write(byte[] b,
                  int off,
                  int len)
指定したバイト配列のオフセットoffから始まるlenバイトをこの出力ストリームに書き込みます.write(b,off,len)の従来の協定は、配列bの一部のバイトを出力ストリームに順次書き込むことである.要素b[off]は、この操作が書き込まれる最初のバイトであり、b[off+len-1]は、この操作が書き込まれる最後のバイトである.
パラメータ:
b-データ.
off-データの初期オフセット量.
len-書き込むバイト数.
4、public void flush()
この出力ストリームをリフレッシュし、すべてのバッファの出力バイトを強制的に書き出します.flushの従来の協定は、この出力ストリームの実装が以前に書き込まれた任意のバイトをバッファリングした場合、このメソッドを呼び出して、これらのバイトを所望のターゲットに直ちに書き込むべきであることを示す.
三、いくつかの原則
1、入力ストリームであれ出力ストリームであれ、使用後はclose()、バッファ付き出力ストリームであれば、閉じる前にflush()を呼び出す.
2、性能を向上させるために、できるだけバッファを使用してIO回数を減らすべきである.
3、文字ストリームで処理できるバイトレスストリーム.
四、例
次に、バイトストリームを操作する例を示します.
操作するテキストファイルx.txt

1      ,     。  
2      ,     。
3 
4 ——    《    》  

1 import java.io.*;
  2 
  3 /**
  4 * Created by IntelliJ IDEA.
  5 *
  6 * @author leizhimin 2008-8-27 22:16:44
  7 */
  8 public class TestIOStream {
  9     public static void main(String[] args) {
 10         testStream();
 11         testBufferedStream();
 12         testSelectStream();
 13     }
 14 
 15     /**
 16      *      
 17      */
 18     public static void testStream() {
 19         InputStream fis = null;
 20         OutputStream fos = null;
 21         try {
 22             fis = new FileInputStream("C:\\x.txt");
 23             fos = new FileOutputStream("C:\\xcopy.txt");
 24             long num = 0;    //      
 25             int bt = 0;      //        
 26             //        ,       -1
 27             //        ,     bt ,        
 28             while ((bt = fis.read()) != -1) {
 29 //                System.out.print(bt);   //                 
 30                 System.out.print((char) bt);   //                 
 31                 fos.write(bt);  //         ,     copy  
 32                 num++;
 33             }
 34             System.out.println("       " + num);
 35             fis.close();
 36             fos.close();
 37         } catch (FileNotFoundException e) {
 38             System.out.println("        !");
 39             e.printStackTrace();
 40         } catch (IOException e) {
 41             System.out.println("       IO  !");
 42             e.printStackTrace();
 43         }
 44     }
 45 
 46     /**
 47      *         
 48      */
 49     public static void testBufferedStream() {
 50         int buffer = 10; //    
 51         try {
 52             BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\x.txt"));
 53             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\bf2.txt"));
 54             int bench = 0;
 55             byte bts[] = new byte[buffer];      //       
 56             while ((bis.read(bts)) != -1) {
 57                 bos.write(bts);  //         ,     copy  
 58                 bench++;
 59             }
 60             System.out.println("bench=" + bench);
 61             //               (    )
 62             bos.flush();
 63             bis.close();
 64             bos.close();
 65         } catch (FileNotFoundException e) {
 66             System.out.println("        !");
 67             e.printStackTrace();
 68         } catch (IOException e) {
 69             System.out.println("       IO  !");
 70             e.printStackTrace();
 71         }
 72     }
 73 
 74     /**
 75      *           
 76      */
 77     public static void testSelectStream() {
 78         OutputStream fos = null;
 79         int buffer = 25;
 80         try {
 81             BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\x.txt"));
 82             fos = new FileOutputStream("C:\\testSelectStream.txt");
 83 
 84             byte bts[] = new byte[buffer];      //    
 85             //      5     ,    10   ,     bts 
 86             //        ,  buffer      “   +      ”,       15,   IndexOutOfBoundsException  
 87             bis.read(bts, 5, 10);
 88             //         ,     copy  
 89             fos.write(bts);
 90 
 91             bis.close();
 92             fos.close();
 93         } catch (FileNotFoundException e) {
 94             System.out.println("        !");
 95             e.printStackTrace();
 96         } catch (IOException e) {
 97             System.out.println("       IO  !");
 98             e.printStackTrace();
 99         }
100     } 
101 }
 

注意:
1、バッファの機能は、自分で何度もデータを連続して書くのではなく、対応するバッファフローによって元のフローを包装することによって実現されるべきで、最後に1つの配列に書くのは愚かなやり方です(しかし、まだ多くの人が使っています).
2、read(byte[]b,int off,int len)という方法はよく体得しなければならない.
3、読み出したバイトを強制的にcharに変換するのは適切ではありません.何が出力できるかを見たくない限り.