1. 程式人生 > >Android建立快取檔案並使用流讀取

Android建立快取檔案並使用流讀取

最近專案中使用到檔案快取,在檔案流使用的時候遇到一點坑,Mark一下。

一、Android下建立應用快取檔案目錄:

File path = context.getDir(String dirName, Context.MODE_PRIVATE);

使用Context的getDir()方法,傳入:
引數1:目錄名;
引數二:模式(應用私有,還是公共)。
如果該目錄存在,會返回一個對應的File物件;如果不存在,會建立該目錄,並返回。

二、獲取快取檔案

File file = new File(File path, String fileName);

使用File物件的構造方法,取得需要的檔案物件,但是該物件可能會不存在,如果是讀取檔案,需要使用以下方式來判斷:(注意不要使用(null == file),檔案不存在,也不返回null)

file.exists()

三、使用BufferedOutputStream對檔案寫入

BufferedOutputStream提供一個預設大小的緩衝區,緩衝輸出流收集寫入的字元以避免每次寫入都引起對裝置的訪問,當緩衝區滿或流被重新整理時,資料被寫入裝置,能夠提升檔案操作的效能。定義一個檔案輸出流,使用如下方式即可:

BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(file));

new FileOutputStream(File file)),該構造方法新建一個指定檔案的輸出流(會自動刪除已經存在的同名檔案)。使用如下程式碼寫入資料:

fos.write(byte[] buffer, int offset, int length);

讀取buffer內從offset往後length長的資料寫入緩衝區,最後幾段重新整理並關閉輸出流:

fos.flush();//重新整理
fos.close();

四、使用BufferedInputStream讀取檔案

程式碼如下:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

讀取前記得對檔案file做判斷 ,file.exists()。

注意:
在對輸入流使用如下方式讀取時:

int len;
byte[] buf = new byte[1024];
while ((len = bis.read(buf)) > 0) {//將資料從輸入流bis讀到記憶體buf
    fos.write(buf, 0, len);//將記憶體資料buf寫入緩衝區fos
}
fos.flush();//將緩衝區資料fos寫入到檔案
fos.close();

******************11111***************

程式執行到“11111”處時,bis 中資料已經處理完畢,這是再次對 bis 訪問,也取不到任何資料了,被這一點坑了許久。