Android 文件系統(tǒng)結構

本文轉載自:Android 文件系統(tǒng)小記

1.概述

??Android 的文件系統(tǒng)結構主要分為內部存儲外部存儲特殊目錄。每個部分都有特定的用途和訪問權限。這邊文章將詳細介紹。

2.內部存儲

??內部存儲是設備的內置存儲,專門用于保存應用的私有數(shù)據(jù)。每個應用都有自己的內部存儲空間,其他應用不能訪問。

  • 路徑:/data/data/<package_name>/

  • 特點

    • 私有性:數(shù)據(jù)對應用本身可見,其他應用無法訪問。

    • 安全性:在設備被擦除或應用被卸載時,這些數(shù)據(jù)會被刪除。

    • 權限:不需要申請額外權限。

2.1 常用路徑和 API

2.1.1 文件存儲路徑

  • 路徑:/data/data/<package_name>/files/

  • API:Context.getFilesDir()

  • 使用場景:存儲應用的配置文件、用戶數(shù)據(jù)等私有文件。

File filesDir = context.getFilesDir();
File myFile = new File(filesDir, "myfile.txt");

2.1.2 緩存存儲路徑

  • 路徑:/data/data/<package_name>/cache/

  • API:Context.getCacheDir()

  • 使用場景:存儲臨時數(shù)據(jù)或緩存文件,系統(tǒng)在需要時可以清除這些文件。

File cacheDir = context.getCacheDir();
File tempFile = new File(cacheDir, "tempfile.tmp");

2.1.3 代碼緩存路徑

  • 路徑:/data/data/<package_name>/code_cache/

  • API:Context.getCodeCacheDir()

  • 使用場景:存儲優(yōu)化后的代碼或編譯后的代碼緩存。

File codeCacheDir = context.getCodeCacheDir();

2.2 內部存儲的使用

// 獲取內部存儲目錄
File internalDir = context.getFilesDir(); // /data/data/<package_name>/files

// 寫文件
File file = new File(internalDir, "example.txt");
try (FileOutputStream fos = new FileOutputStream(file)) {
    fos.write("Hello, World!".getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

// 讀文件
try (FileInputStream fis = new FileInputStream(file)) {
    byte[] data = new byte[(int) file.length()];
    fis.read(data);
    String content = new String(data, "UTF-8");
    System.out.println(content);
} catch (IOException e) {
    e.printStackTrace();
}

3.外部存儲

??外部存儲是設備的共享存儲區(qū)域,可以是內置存儲(如主存儲)或可移動存儲(如 SD 卡)。外部存儲可以被多個應用訪問,但需要申請相應的權限。

  • 公共外部存儲:用于存放用戶可見的文件,如圖片、音頻、視頻等。

    • 路徑:/storage/emulated/0/ 或 Environment.getExternalStoragePublicDirectory()

    • 特點

      • 數(shù)據(jù)對用戶和其他應用可見。

      • 用戶卸載應用時,這些數(shù)據(jù)不會被刪除。

      • 需要申請讀寫權限。

  • 應用專屬外部存儲:用于存放應用的私有數(shù)據(jù),但位于外部存儲中。

    • 路徑:/storage/emulated/0/Android/data/<package_name>/

    • 特點

      • 數(shù)據(jù)對應用本身可見,其他應用無法訪問。

      • 應用卸載時,這些數(shù)據(jù)會被刪除。

      • 需要申請讀寫權限。

3.1 常用路徑和 API

3.1.1 公共外部存儲路徑

  • 路徑:/storage/emulated/0/ 或特定的公共目錄,如 Downloads, Pictures, DCIM, Music, Movies。

  • API:Environment.getExternalStoragePublicDirectory(String type)。

  • 使用場景:存儲用戶可見的文件,如下載的文件、媒體文件等。

File publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File publicFile = new File(publicDir, "downloadedfile.txt");

3.1.2 應用專屬外部存儲路徑

  • 路徑:/storage/emulated/0/Android/data/<package_name>/files/

  • API:Context.getExternalFilesDir(String type)

  • 使用場景:存儲應用的私有文件,用戶可以通過文件管理器訪問,應用卸載時這些文件會被刪除。

File appSpecificDir = context.getExternalFilesDir(null);
File appSpecificFile = new File(appSpecificDir, "appfile.txt");特殊目錄

3.1.3 應用專屬外部緩存路徑

  • 路徑:/storage/emulated/0/Android/data/<package_name>/cache/

  • API:Context.getExternalCacheDir()

  • 使用場景:存儲臨時緩存文件,系統(tǒng)在需要時可以清除這些文件。

File externalCacheDir = context.getExternalCacheDir();
File tempExternalFile = new File(externalCacheDir, "tempfile.tmp");

3.2 外部存儲的使用

// 獲取公共外部存儲目錄
File publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

// 獲取應用專屬外部存儲目錄
File privateDir = context.getExternalFilesDir(null);

// 寫文件到公共外部存儲
File publicFile = new File(publicDir, "public_example.txt");
try (FileOutputStream fos = new FileOutputStream(publicFile)) {
    fos.write("Hello, Public World!".getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

// 寫文件到應用專屬外部存儲
File privateFile = new File(privateDir, "private_example.txt");
try (FileOutputStream fos = new FileOutputStream(privateFile)) {
    fos.write("Hello, Private World!".getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

// 動態(tài)申請權限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
          new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
          REQUEST_WRITE_STORAGE);
}

4.特殊目錄

??Android 提供了一些特殊的目錄,用于存儲特定類型的數(shù)據(jù),如緩存、臨時文件等。

  • 緩存目錄:用于存儲臨時緩存數(shù)據(jù),系統(tǒng)在需要空間時可以自動清理這些數(shù)據(jù)。

    • 內部緩存:context.getCacheDir(),路徑為 /data/data/<package_name>/cache/

    • 外部緩存:context.getExternalCacheDir(),路徑為 /storage/emulated/0/Android/data/<package_name>/cache/

  • 代碼緩存目錄:用于存儲應用的優(yōu)化代碼或其他編譯后的代碼。

    • 路徑:context.getCodeCacheDir()
  • 臨時文件目錄:用于存儲臨時文件,開發(fā)者需要自行管理這些文件。

    • 路徑:context.getExternalFilesDir(Environment.DIRECTORY_TEMPORARY)(API 級別 30+)

??緩存文件被稱為特殊目錄是因為: context.getCacheDir() 被稱為特殊目錄主要是因為它用于存儲應用的臨時緩存數(shù)據(jù),并且具有一些獨特的特性和用途。以下是詳細的解釋:

4.1 特殊性和用途

  1. 臨時性

    • 自動管理:緩存目錄中的文件是臨時文件,系統(tǒng)在需要空間時會自動清理這些文件。

    • 清除策略:當設備存儲空間不足時,系統(tǒng)可能會刪除緩存目錄中的文件以釋放空間。開發(fā)者無需手動管理這些文件的生命周期。

  2. 私有性

    • 應用專有:緩存目錄是應用私有的,其他應用無法訪問這些文件。這與其他內部存儲路徑(如 context.getFilesDir())一樣,提供了安全性和數(shù)據(jù)隔離。
  3. 不需要權限

    • 默認可用:與內部存儲中的其他路徑類似,訪問緩存目錄不需要申請任何額外權限。這使得緩存操作簡單且高效。
  4. 使用場景

    • 臨時存儲:適用于存儲臨時數(shù)據(jù),如圖片緩存、網(wǎng)絡請求緩存等。緩存文件不需要持久保存,可以隨時重新生成。

    • 快速訪問:由于緩存目錄通常存儲在設備的內部存儲中,因此訪問速度較快,適合需要高效讀寫操作的臨時數(shù)據(jù)

4.2 特殊目錄總結

  • 自動管理:系統(tǒng)自動清理,開發(fā)者無需手動管理。

  • 私有安全:僅對應用本身可見,確保數(shù)據(jù)安全。

  • 無需權限:簡化了開發(fā)流程。

  • 適用場景:臨時文件存儲、緩存數(shù)據(jù)等。

5.訪問權限

  • 內部存儲:不需要額外權限。

  • 外部存儲

    • 讀寫公共外部存儲:需要申請 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 權限。

    • 應用專屬外部存儲:從 Android 10 開始,應用可以不需要申請權限直接訪問自己的專屬外部存儲。

6.總結

  • 內部存儲:私有、安全、無需權限。

  • 外部存儲:分為公共和專屬,公共需要權限,專屬不需要權限(Android 10+)。

  • 特殊目錄:用于緩存和臨時數(shù)據(jù),系統(tǒng)自動管理部分目錄。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容