Android 文件操作
2018-01-08 本文已影响0人
JayZhaoCN
Android的存储空间分为内部存储和外部存储两种. 需要注意的是, 无论Android手机有没有SD卡, 内部存储和外部存储都是存在的.
内部存储
内部存储空间十分有限, 是Android系统本身和系统应用程序主要的数据存储所在地, 一旦内部存储空间耗尽, 手机也就无法使用了. 我们应该尽量避免在编码时使用内部存储空间.
/*
* 私有目录结构:
* 1.模拟器
* /data/user/0/包名/cache
* /data/user/0/包名/code_cache
* /data/user/0/包名/databases
* /data/user/0/包名/shared_prefs
* /data/user/0/包名/files
*
* 2.真机
* /data/data/包名/lib
* /data/data/包名/cache
* /data/data/包名/databases
* /data/data/包名/files
* /data/data/包名/shared_prefs
*
* Google官方建议我们将App的数据存储在外部存储的私有目录中该App的包名下,
* 当用户卸载App后, 这些数据会一并删除.
*/
App的Database
, SharedPreference
,Cache
等文件都保存在内部存储中.
Android提供了两个方法来访问内部存储空间:
context.getFilesDir(); // /data/data/包名/files
context.getCacheDir(); // /data/data/包名/cache
外部存储
外部存储和SD卡没有必然的联系, 这里有一个简单的方法区分外部存储和内部存储:
手机连接上电脑, 能被电脑识别的部分就一定是外部存储。
外部存储还被分成应用私有目录和公有目录. 保存在应用私有目录下的文件会在应用被卸载的同时被删除.
私有目录
/storage/emulated/0/Android/data/包名/
建议将App运行过程中产生的文件放入应用私有目录下, 当App卸载后, 私有目录下的文件也会随之删除. 如果不希望文件在App卸载后被删除, 可以将其放入公有目录下.
公有目录
外部存储中私有目录之外的都是公有目录.
参考资料:
1.Android中的文件操作详解以及内部存储和外部存储
2.彻底了解Android中的内部存储与外部存储
最后放上一个比较全的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 {
/*
* 私有目录结构:
* 1.模拟器
* /data/user/0/包名/cache
* /data/user/0/包名/code_cache
* /data/user/0/包名/databases
* /data/user/0/包名/shared_prefs
* /data/user/0/包名/files
*
* 2.真机
* /data/data/包名/lib
* /data/data/包名/cache
* /data/data/包名/databases
* /data/data/包名/files
* /data/data/包名/shared_prefs
*
* Google官方建议我们将App的数据存储在外部存储的私有目录中该App的包名下,
* 当用户卸载App后, 这些数据会一并删除.
*/
/*----------------------------内部存储----------------------------*/
/**
* 获取应用私有目录
* /data/data/包名/files
* 或
* /data/user/0/包名/files
*/
public static File getFilesDir(Context context) {
return context.getFilesDir();
}
/**
* 获取应用缓存目录
* /data/data/包名/cache
* 或
* /data/user/0/包名/cache
*/
public static File getCacheDir(Context context) {
return context.getCacheDir();
}
/**
* 获取内部存储根目录
* /data
*/
public static File getInternalRootDir() {
return Environment.getDataDirectory();
}
/**
* 获取内部存储下载目录
* /data/cache
*/
public static File getInternalDownloadDir() {
return Environment.getDownloadCacheDirectory();
}
/*----------------------------内部存储----------------------------*/
/**
* 获取应用在外部存储的私有目录下的文件目录
* /storage/emulated/0/Android/data/包名/files/目录名
* 目录名可以选择Environment中的多个常量
*/
public static File getAppExternalDir(Context context, String dir) {
return context.getExternalFilesDir(dir);
}
/**
* 获取应用在外部存储的私有目录下的缓存目录
* storage/emulated/0/Android/data/包名/cache
*/
public static File getAppCacheDir(Context context) {
return context.getExternalCacheDir();
}
/**
* 获取外部存储根目录
* /storage/emulated/0
*/
public static File getExternalRootDir() {
return Environment.getExternalStorageDirectory();
}
/**
* 获取外部存储指定目录
* /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;
}
}