Android 數據存儲 (二)文件存儲

轉載請註明出處:http://blog.csdn.net/vnanyesheshou/article/details/73831240

之前說了下Android中Sharedpreferences、SQLite Databases的使用,不太會這兩個的可以參考這兩篇文章:
Android 數據存儲 (一)SharedPreferences
Android 數據存儲 (三)SQLite Databases
這篇主要說一下文件存儲(內部存儲和外部存儲)。


1 Internal Storage

Internal Storage:內部存儲器。
我們可以直接將文件保存在設備的內部存儲設備上。默認情況下,保存到內部存儲的文件對您的應用程序是私有的,其他應用程序無法訪問它們(用戶也不可以)。當用戶卸載您的應用程序時,這些文件將被刪除。

創建和寫入私有文件到內部存儲

String content = "abcdefghigk";
try {
    FileOutputStream os = openFileOutput("internal.txt", MODE_PRIVATE);
    //寫數據
    os.write(content.getBytes());
    os.close();//關閉文件
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
  1. 調用openFileOutput(),參數:文件的名稱和操作模式。這返回一個FileOutputStream。該方式創建的文件路徑爲:/data/data/<包名>/files/目錄下。
  2. write()將字符串寫入文件。
  3. close()關閉輸出流。

文件操作模式有以下四種:

  • MODE_PRIVATE 將創建文件(或替換相同名稱的文件),並使其對您的應用程序是私有的。
  • MODE_APPEND 如果文件已經存在,則將數據寫入現有文件的末尾,而不是將其刪除。
  • MODE_WORLD_READABLE 可讀(不建議)
  • MODE_WORLD_WRITEABLE 可寫(不建議)

從內部存儲讀取文件

byte buffer[] = new byte[4096];
try {
    FileInputStream in = openFileInput("internal.txt");
    //將數據讀到buffer.
    int len = in.read(buffer);
    in.close();//關閉文件
    Log.i(TAG, "buffer="+new String(buffer,0,len));
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
  1. 調用openFileInput()並傳遞要讀取的文件的名稱。這返回一個FileInputStream。
  2. 從文件中讀取字節read()。
  3. 然後關閉流 close()。

如果要在編譯時保存應用程序中的靜態文件,請將該文件保存在項目res/raw/目錄中。您可以打開它 openRawResource(),傳遞資源ID(R.raw.)。此方法返回一個 可用於讀取文件(但不能寫入原始文件)的 InputStream實例。

保存緩存文件

如果您想緩存一些數據,而不是持久存儲,那麼您應該使用它getCacheDir()來打開File代表應用程序應該保存臨時緩存文件的內部目錄。

當設備的內部存儲空間不足時,Android可能會刪除這些緩存文件以恢復空間。但是,您不應該依靠系統來清理這些文件。您應該始終自己維護緩存文件,並保持在合理的空間上限,例如1MB。當用戶卸載您的應用程序時,這些文件將被刪除。

其他有用的方法

  • getFilesDir()
    獲取保存內部文件的文件系統目錄的絕對路徑。
  • getDir()
    在內部存儲空間內創建(或打開現有的)目錄。
  • deleteFile()
    刪除保存在內部存儲上的文件。
  • fileList()
    返回應用程序當前保存的文件數組。

2 External Storage

每個Android兼容設備都支持一個共享的“外部存儲”,您可以使用它來保存文件。這可以是可移動存儲介質(例如SD卡)或內部(不可移動)存儲。保存到外部存儲器的文件是可讀的,用戶可以在使用USB大容量存儲在計算機上傳輸文件時進行修改。

注意:如果用戶將外部存儲器安裝在計算機上或刪除了介質,則外部存儲可能會變得不可用,並且您保存到外部存儲器的文件沒有執行安全性。所有應用程序都可以讀取和寫入放在外部存儲上的文件,用戶可以將其刪除。

訪問外部存儲

爲了在外部存儲上讀取或寫入文件,您的應用程序必須獲取 READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE系統權限。例如:

<uses-permission android:name = “android.permission.READ_EXTERNAL_STORAGE” />
<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE” />

如果您需要讀取和寫入文件,則需要僅請求 WRITE_EXTERNAL_STORAGE權限,因爲它隱含地還需要讀取訪問權限。

注意:從Android 4.4開始,如果您正在閱讀或僅寫入您的應用程序的私有文件,則不需要這些權限。

檢查媒體可用性

在對外部存儲進行任何處理之前,應始終調用getExternalStorageState()以檢查介質是否可用。介質可能安裝到計算機,丟失,只讀或處於某種其他狀態。這裏有幾種可用於檢查可用性的方法:

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

該getExternalStorageState()方法返回您可能想要檢查的其他狀態,如媒體是否被共享(連接到計算機),完全丟失,已被刪除等等。您可以使用這些來通知用戶更多信息您的應用程序需要訪問媒體。
保存可與其他應用共享的文件

從媒體掃描器隱藏您的文件

通常,用戶可以通過應用程序獲取的新文件應該保存到其他應用可以訪問的設備上的“公共”位置,用戶可以輕鬆地從設備中複製它們。這樣做時,你應該使用的共享的公共目錄,如之一Music/,Pictures/和Ringtones/。

爲了得到一個File較合適的公共目錄,呼叫getExternalStoragePublicDirectory(),通過它你想要的目錄的類型,如 DIRECTORY_MUSIC,DIRECTORY_PICTURES, DIRECTORY_RINGTONES,或其他。通過將文件保存到相應的媒體類型目錄,系統的媒體掃描器可以對系統中的文件進行適當的分類(例如,鈴聲在系統設置中顯示爲鈴聲,而不是音樂)。

例如,以下是在公共圖片目錄中爲新相冊創建目錄的方法:

public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory.
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

保存專用的文件

如果您正在處理不適用於其他應用程序的文件(例如只有您的應用程序使用的圖形紋理或聲音效果),則應通過調用在外部存儲上使用專用存儲目錄getExternalFilesDir()。此方法還需要一個type參數來指定子目錄的類型(如DIRECTORY_MOVIES)。如果您不需要特定的媒體目錄,請傳遞null以接收您應用的私有目錄的根目錄。

從Android 4.4開始,在應用程序的私有目錄中讀取或寫入文件不需要READ_EXTERNAL_STORAGE 或WRITE_EXTERNAL_STORAGE 權限。因此,您可以通過添加maxSdkVersion 屬性來聲明只能在較低版本的Android上請求權限:

<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE” android:maxSdkVersion = “18” />

注意: 當用戶卸載您的應用程序時,此目錄及其所有內容將被刪除。此外,系統介質掃描程序不會讀取這些目錄中的文件,因此它們無法從MediaStore內容提供程序訪問。因此,您不應將這些目錄用於最終屬於用戶的媒體,例如您的應用程序捕獲或編輯的照片,或用戶使用您的應用購買的音樂 - 這些文件應保存在公共目錄中。

保存緩存文件

打開一個File,該File代表您應該保存緩存文件的外部存儲目錄,請調用getExternalCacheDir()。如果用戶卸載您的應用程序,這些文件將被自動刪除。

提示: 要保留文件空間並保持應用程序的性能,請務必仔細管理緩存文件,並在整個應用程序的生命週期中刪除不再需要的緩存文件。


歡迎掃一掃關注我的微信公衆號,定期推送優質技術文章:

這裏寫圖片描述

發佈了129 篇原創文章 · 獲贊 270 · 訪問量 97萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章