Android 文件操作

Android的存儲(chǔ)空間分為內(nèi)部存儲(chǔ)外部存儲(chǔ)兩種. 需要注意的是, 無論Android手機(jī)有沒有SD卡, 內(nèi)部存儲(chǔ)和外部存儲(chǔ)都是存在的.

內(nèi)部存儲(chǔ)

內(nèi)部存儲(chǔ)空間十分有限, 是Android系統(tǒng)本身和系統(tǒng)應(yīng)用程序主要的數(shù)據(jù)存儲(chǔ)所在地, 一旦內(nèi)部存儲(chǔ)空間耗盡, 手機(jī)也就無法使用了. 我們應(yīng)該盡量避免在編碼時(shí)使用內(nèi)部存儲(chǔ)空間.

 /*
     * 私有目錄結(jié)構(gòu):
     * 1.模擬器
     *  /data/user/0/包名/cache
     *  /data/user/0/包名/code_cache
     *  /data/user/0/包名/databases
     *  /data/user/0/包名/shared_prefs
     *  /data/user/0/包名/files
     *
     * 2.真機(jī)
     *  /data/data/包名/lib
     *  /data/data/包名/cache
     *  /data/data/包名/databases
     *  /data/data/包名/files
     *  /data/data/包名/shared_prefs
     *
     *  Google官方建議我們將App的數(shù)據(jù)存儲(chǔ)在外部存儲(chǔ)的私有目錄中該App的包名下,
     * 當(dāng)用戶卸載App后, 這些數(shù)據(jù)會(huì)一并刪除.
     */

App的Database, SharedPreference,Cache等文件都保存在內(nèi)部存儲(chǔ)中.
Android提供了兩個(gè)方法來訪問內(nèi)部存儲(chǔ)空間:

context.getFilesDir();  // /data/data/包名/files
context.getCacheDir();  // /data/data/包名/cache
外部存儲(chǔ)

外部存儲(chǔ)和SD卡沒有必然的聯(lián)系, 這里有一個(gè)簡(jiǎn)單的方法區(qū)分外部存儲(chǔ)和內(nèi)部存儲(chǔ):

手機(jī)連接上電腦, 能被電腦識(shí)別的部分就一定是外部存儲(chǔ)。

外部存儲(chǔ)還被分成應(yīng)用私有目錄公有目錄. 保存在應(yīng)用私有目錄下的文件會(huì)在應(yīng)用被卸載的同時(shí)被刪除.

私有目錄
/storage/emulated/0/Android/data/包名/

建議將App運(yùn)行過程中產(chǎn)生的文件放入應(yīng)用私有目錄下, 當(dāng)App卸載后, 私有目錄下的文件也會(huì)隨之刪除. 如果不希望文件在App卸載后被刪除, 可以將其放入公有目錄下.

公有目錄

外部存儲(chǔ)中私有目錄之外的都是公有目錄.

參考資料:
1.Android中的文件操作詳解以及內(nèi)部存儲(chǔ)和外部存儲(chǔ)
2.徹底了解Android中的內(nèi)部存儲(chǔ)與外部存儲(chǔ)

最后放上一個(gè)比較全的Android文件操作工具類吧, 光講沒啥印象, 還是多寫代碼, 理解才深刻.

package com.hfut.zhaojiabao.myrecord.utils;

import android.content.Context;
import android.os.Environment;
import android.os.StatFs;

import java.io.File;

/**
 * @author zhaojiabao (zhaojiabao@huami.com)
 */

public class FileUtil {
    /*
     * 私有目錄結(jié)構(gòu):
     * 1.模擬器
     *  /data/user/0/包名/cache
     *  /data/user/0/包名/code_cache
     *  /data/user/0/包名/databases
     *  /data/user/0/包名/shared_prefs
     *  /data/user/0/包名/files
     *
     * 2.真機(jī)
     *  /data/data/包名/lib
     *  /data/data/包名/cache
     *  /data/data/包名/databases
     *  /data/data/包名/files
     *  /data/data/包名/shared_prefs
     *
     *  Google官方建議我們將App的數(shù)據(jù)存儲(chǔ)在外部存儲(chǔ)的私有目錄中該App的包名下,
     * 當(dāng)用戶卸載App后, 這些數(shù)據(jù)會(huì)一并刪除.
     */

    /*----------------------------內(nèi)部存儲(chǔ)----------------------------*/

    /**
     * 獲取應(yīng)用私有目錄
     * /data/data/包名/files
     * 或
     * /data/user/0/包名/files
     */
    public static File getFilesDir(Context context) {
        return context.getFilesDir();
    }

    /**
     * 獲取應(yīng)用緩存目錄
     * /data/data/包名/cache
     * 或
     * /data/user/0/包名/cache
     */
    public static File getCacheDir(Context context) {
        return context.getCacheDir();
    }

    /**
     * 獲取內(nèi)部存儲(chǔ)根目錄
     * /data
     */
    public static File getInternalRootDir() {
        return Environment.getDataDirectory();
    }

    /**
     * 獲取內(nèi)部存儲(chǔ)下載目錄
     * /data/cache
     */
    public static File getInternalDownloadDir() {
        return Environment.getDownloadCacheDirectory();
    }

    /*----------------------------內(nèi)部存儲(chǔ)----------------------------*/

    /**
     * 獲取應(yīng)用在外部存儲(chǔ)的私有目錄下的文件目錄
     * /storage/emulated/0/Android/data/包名/files/目錄名
     * 目錄名可以選擇Environment中的多個(gè)常量
     */
    public static File getAppExternalDir(Context context, String dir) {
        return context.getExternalFilesDir(dir);
    }

    /**
     * 獲取應(yīng)用在外部存儲(chǔ)的私有目錄下的緩存目錄
     * storage/emulated/0/Android/data/包名/cache
     */
    public static File getAppCacheDir(Context context) {
        return context.getExternalCacheDir();
    }

    /**
     * 獲取外部存儲(chǔ)根目錄
     * /storage/emulated/0
     */
    public static File getExternalRootDir() {
        return Environment.getExternalStorageDirectory();
    }

    /**
     * 獲取外部存儲(chǔ)指定目錄
     * /storage/emulated/0/目錄名
     */
    public static File getExternalDir(String dir) {
        return Environment.getExternalStoragePublicDirectory(dir);
    }

    /**
     * 判斷SD卡是否被掛載
     */
    public static boolean isSDCardMounted() {
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }

    /**
     * 獲取SD卡根目錄
     *
     * @return /storage/emulated/0
     */
    public static String getSDCardBaseDir() {
        if (isSDCardMounted()) {
            return Environment.getExternalStorageDirectory().getAbsolutePath();
        }
        return null;
    }

    /**
     * 獲取SD卡大小(MB), 若未掛載, 返回-1
     */
    public static long getSDCardSize() {
        if (isSDCardMounted()) {
            StatFs statFs = new StatFs(getSDCardBaseDir());
            long count = statFs.getBlockCountLong();
            long size = statFs.getBlockSizeLong();
            return count * size / 1024 / 1024;
        }
        return -1;
    }

    /**
     * 獲取SD卡空閑空間大小(MB), 若未掛載, 返回-1
     */
    public static long getSDCardFreeSize() {
        if (isSDCardMounted()) {
            StatFs statFs = new StatFs(getSDCardBaseDir());
            long freeCount = statFs.getFreeBlocksLong();
            long size = statFs.getBlockSizeLong();
            return freeCount * size / 1024 / 1024;
        }
        return -1;
    }

    /**
     * 獲取SD卡可用空間大小(MB), 若未掛載, 返回-1
     */
    public static long getSDCardAvailableSize() {
        if (isSDCardMounted()) {
            StatFs statFs = new StatFs(getSDCardBaseDir());
            long availableCount = statFs.getAvailableBlocksLong();
            long size = statFs.getBlockSizeLong();
            return availableCount * size / 1024 / 1024;
        }
        return -1;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容