在每次使用FileInputStream的read方法時,需要用到字節數組bytes和真實讀取長度len,如代碼:
public static void read(){
File file = new File("D:/學習/Android/代碼/Workplace/Java_8_1_File/a.txt");
try {
//針對文件創建一個輸入流
InputStream in = new FileInputStream(file);
byte[] bytes = new byte[1024*1024*10];//定義一個10MB的字節數組
int len = -1;//每次真實讀取的長度
StringBuffer buf = new StringBuffer();
try {
while((len = in.read(bytes))!=-1){
buf.append(new String(bytes,0,len));
}
in.close();//關閉
System.out.println(buf);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
,其中在循環裡,buf.append那一句中,每一次都把0處len字節數加入到buf中,那麼倘若文件的數據是:
01234
為何最後輸出的結果不是:
001012012301234
呢?
首先呢這個bytes是干什麼的?
緩沖區,就是防止大數據量的時候,我們每次只讀取一部分數據到緩沖區中進行操作
那麼這個len又是什麼呢?
它是實際的讀取字節的數
你如果學過數據結構就知道這是一種線性表的思想
因為有時候讀取的數據是不能填滿這個bytes的,那麼len就是實際的數
你抓住讀取思想:
每次都是讀取文件的bytes大小數據放到bytes數組中
所以取的時候自然是從bytes的0處去取
buf.append(new String(bytes,0,len));
加上len,用於防止最後一次的操作錯誤,最後一次取的數據實際長度是小於等於bytes的長度的,如果小於,那麼bytes還殘留著上次的數據。
所以使用len來讀取最後一次實際取的數據。
建議去看看線性表