android InputStream中read()与read(byte[] b)
InputStream的read()讀取文件的使用。
??? 這兩個方法在抽象類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文檔的內容:
運行結果:3.1415926 No pains,No gains!!(亂碼亂碼)
InputStreamTest1.java代碼如下:
運行結果:
3.1415926 No pains,No gains!!?最是那一低頭的溫柔,像一朵水蓮花不勝涼風的嬌羞。
這里還簡單提一個函數:java.io.InputStream.read(byte[] b, int off, int len)?
java.io.InputStream.read(byte[] b, int off, int len)?方法從輸入流讀取轉換為字節數組數據達到len個字節。如果參數len為0,則讀取任何字節并返回0;否則有嘗試讀取至少一個字節。如果該流是在該文件的末尾,則返回的值為-1。
聲明
以下是java.io.InputStream.read(byte[] b, int off, int len) 方法的聲明:
public int read(byte[] b, int off, int len)參數
-
b?-- 目標字節數組。
-
off?-- 在數組b在其中寫入數據的起始位置的偏移。
-
len?-- 要讀取的字節數。
返回值
該方法返回讀入緩沖區的總字節數,或如果沒有更多的數據,因為數據流的末尾已到達返回-1。
異常
-
IOException?-- 如果發生I/ O錯誤。
-
NullPointerException?-- 如果b為?null.
-
IndexOutOfBoundsException?-- 如果off為負,len為負,或len大于b.length - off。
這個函數可以首先新建一個比較大的數組,然后每次讀取部分數據到數組里,再可以自己進行使用。這樣可以避免多次讀取時讀取大小變化從而導致不停傳進數組的問題。
android InputStream中read()與read(byte[] b)就講完了。
就這么簡單。
總結
以上是生活随笔為你收集整理的android InputStream中read()与read(byte[] b)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 追加写入数据到文件
- 下一篇: android 从文件制定位置读取数据