這兩個方法在抽象類InputStream中都是做爲抽象方法存在的,java
JDK API中是這樣描述二者的:數組
read() : 從輸入流中讀取數據的下一個字節,返回0到255範圍內的int字節值。若是由於已經到達流末尾而沒有可用的字節,則返回-1。在輸入數據可用、檢測到流末尾或者拋出異常前,此方法一直阻塞。eclipse
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] 的元素。spa
由幫助文檔中的解釋可知,read()方法每次只能讀取一個字節,因此也只能讀取由ASCII碼範圍內的一些字符。這些字符主要用於顯示現代英語和其餘西歐語言。而對於漢字等unicode中的字符則不能正常讀取。只能以亂碼的形式顯示。code
對於read()方法的上述缺點,在read(byte[] b)中則獲得瞭解決,就拿漢字來舉例,一個漢字佔有兩個字節,則能夠把參數數組b定義爲大小爲2的數組便可正常讀取漢字了。固然b也能夠定義爲更大,好比若是b=new byte[4]的話,則每次能夠讀取兩個漢字字符了,可是須要注意的是,若是此處定義b 的大小爲3或7等奇數,則對於全是漢字的一篇文檔則不能所有正常讀寫了。orm
下面用實例來演示一下兩者的用法:ip
實例說明:類InputStreamTest.java 來演示read()方法的使用。類InputStreamTest1.java來演示read(byte[] b)的使用。兩個類的主要任務都是經過文件輸入流FileInputStream來讀取文本文檔yhw.txt中的內容,而且輸出到控制檯上顯示。utf-8
先看一下yhw.txt文檔的內容:
InputStreamTest.java代碼以下:
運行結果:3.1415926 No pains,No gains!!(亂碼亂碼)
InputStreamTest1.java代碼以下:
運行結果:
3.1415926 No pains,No gains!! 最是那一低頭的溫柔,像一朵水蓮花不勝涼風的嬌羞。
inputStream的三個read()方法的區別
1.read
這個方法是對這個流一個一個字節的讀,返回的int就是這個字節的int表示方式
如下是代碼片斷,通過測試當eclipse的編碼爲gbk時,轉化出的字符串不需通過從新編碼,若是eclipse的編碼爲utf-8時則由byte轉成字符串需從新編成utf-8的
InputStream in = Test.class.getResourceAsStream("/tt.txt"); byte[]tt=new byte[15];//測試用的事前知道有15個字節碼 while(in.available()!=0){ for(int i=0;i<15;i++){ tt[i]=(byte)in.read(); } } String ttttt=new String(tt,"utf-8"); System.out.println(ttttt); in.close();
2.read(byte[] b)
這個方法是先規定一個數組長度,將這個流中的字節緩衝到數組b中,返回的這個數組中的字節個數,這個緩衝區沒有滿的話,則返回真實的字節個數,到未尾時都返回-1
in = Test.class.getResourceAsStream("/tt.txt"); byte [] tt=new byte[1024]; int b; while((b=in.read(tt))!=-1){ System.out.println(b); String tzt=new String(tt,"utf-8"); System.out.println(tzt); }
3.read(byte[] b, int off, int len)
此方法其實就是屢次調用了read()方法
InputStream in = Test.class.getResourceAsStream("/tt.txt"); //System.out.println(in.available());//此方法是返回這個流中有多少個字節數,能夠把數組長度定爲這個 byte[]tt=new byte[in.available()]; int z; while((z=in.read(tt, 0, tt.length))!=-1){ System.out.println(new String(tt,"utf-8")); }