android學習(三) 保存文件

所有Android設備都有兩個文件存儲區域:”內部”和”外部”存儲。
內部存儲
1. 它始終可用。
2. 只有您的應用可以訪問此處保存的文件。
3. 當用戶卸載您的應用時,系統會從內部存儲中移除您的應用的所有文件。
外部存儲
1. 他並非使用可用,因爲用戶可採用USB存儲設備的形式裝載外部存儲,並在某些情況下會從設備中將其移除。
2. 它是全局可讀的,因此此處保存的文件可能不受您控制地被讀取。
3. 當用戶卸載您地應用時,只有您通過getExternalFilesDir()將您的應用的文件保存在目錄中時,系統纔會從此處移除您的應用的文件。
:對於無需訪問限制以及您希望與其他應用共享或允許用戶使用計算機訪問的文件,外部存儲是最佳位置。
提示:儘管應用默認外部在內部存儲中,但您可在您的清單文件中指定android:installLocation屬性

將文件保存在內部存儲中

在內部存儲中保存文件時,您可以通過調用一下兩種方法之一作爲File的相應目錄:

getFilesDir() 返回表示您的應用的內部目錄的File
getCacheDir() 返回表示您的應用臨時緩存文件的內部目錄的 File。 務必刪除所有不再需要的文件並對在指定時間您使用的內存量實現合理大小限制,比如,1MB。 如果在系統即將耗盡存儲,它會在不進行警告的情況下刪除您的緩存文件

如果要在這些目錄之一新建文件,可以使用File()構造函數。

File file = new File(context.getFilesDir,fileName);
File file = new File(context.getCacheDir,fileName);

也可以調用openFileOutput()獲取寫入到內部目錄中的文件的FileOutputStream

String fileName = "myFile";
String s = "hello world";
FileOutputStream fileOutputStream;
try {
    fileOutputStream = openFileOutput(fileName, Context.MODE_PRIVATE);
    fileOutputStream.write(s.getBytes());
    fileOutputStream.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

如果需要緩存某些文件時,應改用createTempFile()

public File getTempFile(Context context, String url){
        File file = null;
        try {
            String fileName = Uri.parse(url).getLastPathSegment();
            file = File.createTempFile(fileName, null, context.getCacheDir())//第一個參數是文件前綴,第二個參數是文件後綴。
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

將文件保存在外部存儲中

由於外部存儲可能不可用,可以通過調用getExternalStorageState()查詢外部存儲狀態。如果返回的狀態爲MEDIA_MOUNTED,那麼就可以對您的文件進行讀寫。

//檢查外部存儲是否可用於讀寫
    public boolean isExternalStorageWritable(){
        String state = Environment.getExternalStorageState();
        if(Environment.MEDIA_MOUNTED.equals(state)){
            return true;
        }
        return false;
    }
//檢查外部存儲是否可用至少讀取
    public boolean isExternalStorageReadable(){
        String state = Environment.getExternalStorageState();
        if(Environment.MEDIA_MOUNTED.equals(state)||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
            return true;
        }
        return false;
    }

外部文件也可設爲公共文件和私有文件。
公共文件
應供其他應用和用戶自由使用的文件。 當用戶卸載您的應用時,用戶應仍可以使用這些文件。例如,您的應用拍攝的照片或其他已下載的文件。
私有文件
屬於您的應用且在用戶卸載您的應用時應予刪除的文件。 儘管這些文件在技術上可被用戶和其他應用訪問(因爲它們存儲在外部存儲中), 但它們實際上不向您的應用之外的用戶提供任何輸出值。 當用戶卸載您的應用時,系統會刪除應用外部私有目錄中的所有文件。
例如,您的應用下載的其他資源或臨時介質文件。


如果您要將公共文件保存在外部存儲設備中,請使用getExternalStoragePublicDirectory() 方法獲取表示外部存儲設備上相應目錄的File。該方法使用指定您想要保存以便它們可以與其他公共文件在邏輯上組織在一起的文件類型的參數,比如 DIRECTORY_MUSIC DIRECTORY_PICTURES

//獲取相冊存儲目錄
public File getAlbumStorageDir(String albumName){
    File file = new File(Environment.getExternalStoragePublicDirectory(
    Environment.DIRECTORY_PICTURES),albumName);
    if(!file.mkdirs()){
        Log.e("文件錯誤","文件創建失敗");
    }
    return file;
}

如果您要保存您的應用專用文件,您可以通過調用 getExternalFilesDir() 並向其傳遞指示您想要的目錄類型的名稱,從而獲取相應的目錄。通過這種方法創建的各個目錄將添加至封裝您的應用的所有外部存儲文件的父目錄,當用戶卸載您的應用時,系統會刪除這些文件。

public File getAlbumStorageDir(Context context, String albumName){
    File file = new File(context.getExternalFilesDir(
    Environment.DIRECTORY_PICTURES),albumName);
    if(!file.mkdirs()){
        Log.e("文件錯誤","文件創建失敗");
    }
    return file;
}

如果沒有適合的文件的預定義子目錄名稱,可以調用getExternalFilesDir() 並傳入null。這將返回外部存儲上您的應用的專用目錄的根目錄。


查詢可用空間

方法 解釋
getFreeSpace() 目前的可用空間
getTotalSpace() 存儲卷中的總空間

刪除文件

您應始終刪除不再需要的文件。刪除文件最直接的方法是讓打開的文件參考自行調用 delete()。

myFile.delete();

如果文件保存在內部存儲中,您還可以請求 Context 通過調用 deleteFile() 來定位和刪除文件:

myContext.deleteFile(fileName);

注:當用戶卸載您的應用時,Android 系統會刪除以下各項:
您保存在內部存儲中的所有文件
您使用 getExternalFilesDir() 保存在外部存儲中的所有文件。
但是,您應手動刪除使用 getCacheDir() 定期創建的所有緩存文件並且定期刪除不再需要的其他文件。
摘自android developer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章