轉載請注意出處:http://blog.csdn.net/fengye454545/article/details/79572165
以前用到I/O操作基本就是仿照網上的Demo代碼,寫的時候也是很匆忙,根本也是不了解其中的意思,是以今天也是回過頭重新看了看。看到InputStream.read(byte[])時也是對參數有點不解,上網查了半天也是沒有具體答案,可能太簡單了吧

。
不過來到這裡的小夥伴們肯定也是對這個參數很是疑惑,别着急,待我細細叨來。
一、位元組(byte) 與字元的差别
首先來講一下這兩個概念的差別。
位元組:是由8個二進制數組成,也就是8個0或一組成。
字元:字元的大小由實際的編碼規則有關,比如在GBK中一個漢字由2個位元組組成,而在utf-8中一個漢字由3個或者4個位元組組成。
具體詳解,推薦部落格:http://blog.csdn.net/u010276761/article/details/52692962
二、InputStream.read(byte[])參數詳解
byte數組作為一個緩沖區,每次存入和緩沖區一樣大小(byte.length)的資料。當然實際存入的資料是一個個十進制的整數。整個流程是這樣子的,檔案 -> 輸入位元組流(二進制整數) -> 十進制整數(通過read(byte[])實作)
那麼byte[]中緩沖區大小取多少合适呢,這個要取決于你的檔案資料内容大小了。什麼都别說上代碼。
2.1 這是檔案内容,為了友善測試,内容不必取太多。
2.2 測試代碼
public static void main(String[] args) throws IOException{
InputStream in;
File file = new File("E://text.txt");
byte[] b = new byte[4];
in = new FileInputStream(file);
int len = 0;
while((len = in.read(b)) != -1){
String str = new String(b);
System.out.println(str);
System.out.println(len);
}
}
2.3 執行結果
可以看出,(len = in.read(b) != -1)解釋:輸入位元組流in按照byte數組緩沖區每4個位元組循環一次進行read操作,直到讀到-1這個整數(-1是一個辨別,就是檔案資料的末尾)。
注意:可以看到在“呀!?”後面多出一個問号,但是實際檔案裡并沒有問号,這是因為String資料類型強制轉化的問題,byte數組大小為4,這意味着每4個位元組一讀,“我愛”和“中國”都各占4個位元組(采用GBK編碼),而“呀!”僅僅占了3個位元組,(中文的感歎号占了2個位元組而英文的僅占1個位元組,這裡我們采用英文感歎号(采用GBK編碼)),在byte數組裡就多出一個位元組的位置,但是String類哪有那麼智能,就把最後一個位置轉化成問号(有時候可能是正方形)
正确方式:在While循環語句内加入通過ByteArrayOutputStream這一位元組緩沖區,他會将所有位元組結合在一起,依次往下添加資料。
public static void main(String[] args) throws IOException{
InputStream in;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
File file = new File("E://text.txt");
byte[] b = new byte[4];
in = new FileInputStream(file);
int len = 0;
String str = null;
while((len = in.read(b)) != -1){
outStream.write(b,0,len);
byte[] data = outStream.toByteArray();
str = new String(data, "GBK");
System.out.println(len);
}
System.out.println(str);
}
輸出結果:
菜鳥一隻,如有不對之處請指出。您的鼓勵是我寫作的最大動力!