這兩個方法在抽象類別InputStream中都是作為抽象方法存在的,
JDK API中是這樣描述兩者的:
read() : 從輸入資料流中讀取資料的下一個位元組,返回0到255範圍內的int位元組值。如果因為已經到達流末尾而沒有可用的位元組,則返回-1。在輸入資料可用、檢測到流末尾或者拋出異常前,此方法一直阻塞。
read(byte[] b) : 從輸入資料流中讀取一定數量的位元組,並將其儲存在緩衝區數組 b 中。以整數形式返回實際讀取的位元組數。在輸入資料可用、檢測到檔案末尾或者拋出異常前,此方法一直阻塞。
如果 b 的長度為 0,則不讀取任何位元組並返回 0;否則,嘗試讀取至少一個位元組。如果因為流位於檔案末尾而沒有可用的位元組,則傳回值 -1;否則,至少讀取一個位元組並將其儲存在 b 中。
將讀取的第一個位元組儲存在元素 b[0] 中,下一個儲存在 b[1] 中,依次類推。讀取的位元組數最多等於 b 的長度。設 k 為實際讀取的位元組數;這些位元組將儲存在 b[0] 到 b[k-1] 的元素中,不影響 b[k] 到 b[b.length-1] 的元素。
由協助文檔中的解釋可知,read()方法每次只能讀取一個位元組,所以也只能讀取由ASCII碼範圍內的一些字元。這些字元主要用於顯示現代英語和其他西歐語言。而對於漢字等unicode中的字元則不能正常讀取。只能以亂碼的形式顯示。
對於read()方法的上述缺點,在read(byte[] b)中則得到瞭解決,就拿漢字來舉例,一個漢字佔有兩個位元組,則可以把參數數組b定義為大小為2的數組即可正常讀取漢字了。當然b也可以定義為更大,比如如果b=new byte[4]的話,則每次可以讀取兩個漢字字元了,但是需要注意的是,如果此處定義b 的大小為3或7等奇數,則對於全是漢字的一篇文檔則不能全部正常讀寫了。
下面用執行個體來示範一下二者的用法:
執行個體說明:類InputStreamTest.java 來示範read()方法的使用。類InputStreamTest1.java來示範read(byte[] b)的使用。兩個類的主要任務都是通過檔案輸入資料流FileInputStream來讀取文字文件yhw.txt中的內容,並且輸出到控制台上顯示。
先看一下yhw.txt文檔的內容:
InputStreamTest1.java代碼如下:
運行結果:
3.1415926 No pains,No gains!!