Android 文件系統(tǒng)結(jié)構(gòu)

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

1.概述

??Android 的文件系統(tǒng)結(jié)構(gòu)主要分為內(nèi)部存儲外部存儲特殊目錄缀去。每個部分都有特定的用途和訪問權(quán)限。這邊文章將詳細介紹锰茉。

2.內(nèi)部存儲

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

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

  • 特點

    • 私有性:數(shù)據(jù)對應(yīng)用本身可見绽昏,其他應(yīng)用無法訪問协屡。

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

    • 權(quán)限:不需要申請額外權(quán)限肤晓。

2.1 常用路徑和 API

2.1.1 文件存儲路徑

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

  • API:Context.getFilesDir()

  • 使用場景:存儲應(yīng)用的配置文件、用戶數(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 內(nèi)部存儲的使用

// 獲取內(nèi)部存儲目錄
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.外部存儲

??外部存儲是設(shè)備的共享存儲區(qū)域余蟹,可以是內(nèi)置存儲(如主存儲)或可移動存儲(如 SD 卡)卷胯。外部存儲可以被多個應(yīng)用訪問子刮,但需要申請相應(yīng)的權(quán)限。

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

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

    • 特點

      • 數(shù)據(jù)對用戶和其他應(yīng)用可見橱赠。

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

      • 需要申請讀寫權(quán)限。

  • 應(yīng)用專屬外部存儲:用于存放應(yīng)用的私有數(shù)據(jù)回季,但位于外部存儲中服猪。

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

    • 特點

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

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

      • 需要申請讀寫權(quán)限漓柑。

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 應(yīng)用專屬外部存儲路徑

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

  • API:Context.getExternalFilesDir(String type)

  • 使用場景:存儲應(yīng)用的私有文件,用戶可以通過文件管理器訪問涵叮,應(yīng)用卸載時這些文件會被刪除嫩絮。

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

3.1.3 應(yīng)用專屬外部緩存路徑

  • 路徑:/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);

// 獲取應(yīng)用專屬外部存儲目錄
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();
}

// 寫文件到應(yīng)用專屬外部存儲
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)申請權(quán)限
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ù)氢伟。

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

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

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

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

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

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

4.1 特殊性和用途

  1. 臨時性

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

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

  2. 私有性

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

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

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

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

4.2 特殊目錄總結(jié)

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

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

  • 無需權(quán)限:簡化了開發(fā)流程屈张。

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

5.訪問權(quán)限

  • 內(nèi)部存儲:不需要額外權(quán)限阁谆。

  • 外部存儲

    • 讀寫公共外部存儲:需要申請 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 權(quán)限碳抄。

    • 應(yīng)用專屬外部存儲:從 Android 10 開始,應(yīng)用可以不需要申請權(quán)限直接訪問自己的專屬外部存儲场绿。

6.總結(jié)

  • 內(nèi)部存儲:私有剖效、安全、無需權(quán)限焰盗。

  • 外部存儲:分為公共和專屬璧尸,公共需要權(quán)限,專屬不需要權(quán)限(Android 10+)熬拒。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澎粟,一起剝皮案震驚了整個濱河市蛀序,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捌议,老刑警劉巖哼拔,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件引有,死亡現(xiàn)場離奇詭異瓣颅,居然都是意外死亡,警方通過查閱死者的電腦和手機譬正,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門宫补,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檬姥,“玉大人,你說我怎么就攤上這事粉怕〗∶瘢” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵贫贝,是天一觀的道長秉犹。 經(jīng)常有香客問我,道長稚晚,這世上最難降的妖魔是什么崇堵? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮客燕,結(jié)果婚禮上鸳劳,老公的妹妹穿的比我還像新娘。我一直安慰自己也搓,他們只是感情好赏廓,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傍妒,像睡著了一般幔摸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颤练,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天抚太,我揣著相機與錄音,去河邊找鬼昔案。 笑死尿贫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的踏揣。 我是一名探鬼主播庆亡,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捞稿!你這毒婦竟也來了又谋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娱局,失蹤者是張志新(化名)和其女友劉穎彰亥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰齐,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡任斋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耻涛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片废酷。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘟檩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澈蟆,到底是詐尸還是另有隱情墨辛,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布趴俘,位于F島的核電站睹簇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寥闪。R本人自食惡果不足惜带膀,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橙垢。 院中可真熱鬧垛叨,春花似錦、人聲如沸柜某。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喂击。三九已至剂癌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翰绊,已是汗流浹背佩谷。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留监嗜,地道東北人谐檀。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像裁奇,于是被迫代替她去往敵國和親桐猬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容