java InputStream中的問題

這篇文章是我從一個高手的博客中粘貼過來的,對此先表示歉意。但實在寫的太好,沒有忍住......程序員

 1. 關於InputStream.read()網絡

     在從數據流裏讀取數據時,爲圖簡單,常常用InputStream.read()方法。這個方法是從流裏每次只讀取讀取一個字節,效率會很是低。     更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次讀取多個字節。ide


2. 關於InputStream類的available()方法
    要一次讀取多個字節時,常常用到InputStream.available()方法,這個方法能夠在讀寫操做前先得知數據流裏有多少個字節能夠讀取。須要注意的是,若是這個方法用在從本
地文件讀取數據時,通常不會遇到問題,但若是是用於網絡操做,就常常會遇到一些麻煩。好比,Socket通信時,對方明明發來了1000個字節,可是本身的程序調用available()方法卻只獲得900,或者100,甚至是0,感受有點莫名其妙,怎麼也找不到緣由。其實,這是由於網絡通信每每是間斷性的,一串字節每每分幾批進行發送。本地程序調用available()方法有時獲得0,這多是對方尚未響應,也多是對方已經響應了,可是數據尚未送達本地。對方發送了1000個字節給你,也許分紅3批到達,這你就要調用3次available()方法才能將數據總數所有獲得。
      若是這樣寫代碼:
  int count = in.available();
  byte[] b = new byte[count];
  in.read(b);
      在進行網絡操做時每每出錯,由於你調用available()方法時,對發發送的數據可能尚未到達,你獲得的count是0。
         須要改爲這樣:
  int count = 0;
  while (count == 0) {
   count = in.available();
  }
  byte[] b = new byte[count];
  in.read(b);
3. 關於InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)這兩個方法都是用來從流裏讀取多個字節的,有經驗的程序員就會發現,這兩個方法常常 讀取不到本身想要讀取的個數的字節。好比第一個方法,程序員每每但願程序能讀取到b.length個字節,而實際狀況是,系統每每讀取不了這麼多。仔細閱讀Java的API說明就發現了,這個方法 並不保證能讀取這麼多個字節,它只能保證最多讀取這麼多個字節(最少1個)。所以,若是要讓程序讀取count個字節,最好用如下代碼:
  byte[] b = new byte[count];
  int readCount = 0; // 已經成功讀取的字節的個數
  while (readCount < count) {
   readCount += in.read(bytes, readCount, count - readCount);
  }
      用這段代碼能夠保證讀取count個字節,除非中途遇到IO異常或者到了數據流的結尾(EOFException)spa