文章出自:android中的文件操作详解以及内部存储和外部存储
内部存储(internal storage)
内部存储并不是指内存。
内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的,当这个应用被卸载以后,内部存储中的文件也会被删除。
从技术上来讲,如果你在创建内部存储文件的时间,将文件属性设置成可读,其它app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果是可读的,便可以读取该文件。
如果一个文件的属性是私有(private)的,那么即使知道包名,其它应用也无法访问。
内部存储空间十分有限,因此显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。SgaredPreference和SQLite数据库都是存储在内部存储空间上的。
内部存储一般都是用context获取的,也就是当前的上下文环境中,不是用Context这个类。
用例:
在Activity中:
1). //获取APP的内部存储空间
File file = getFileDir();
2). //读写应用在内部存储空间上的文件
openFileOutPut(String name,int mode);
openFileInput(String name);
3). //列出所有已经创建的文件
String files[] = fileList();
4). //删除创建的文件
boolean flag = deleteFile(String fileName);
5). //根据名字获取文件目录(可根据返回的File对象,获取到其操作路径)
File file = getDir(String name,int mode);
外部存储(external Storage)
所有的安卓设备都有外部存储和内部存储,不管安卓手机是否有可移动的SDCard,他们总是有外部存储和内部存储。
最关键的是,我们都是可以通过相同的api来访问可移动的sdCard或者手机自带的存储(外部存储)
外部存储中的文件是可以被用户或者其它应用程序所修改的,有两种类型的文件(或者目录)
1.公共文件(public Files):
文件是可以被自由访问,且文件的数据对其它应用或者用户来说都是有意义的,当应用被卸载之后,其卸载前所创建的文件仍然保留。比如照相机应用,拍下来的照片大家都可以访问,如果把照相机卸载以后,照片仍然存在,这就是公共文件。
创建方法:
File file = Environment.getExternalStoragePublicDirectory(Enviroment.DIRECTORY_PICTU
RES);
File finalFile = new File(file,"公共文件");
2.私有文件(private Files):
其实由于是外部存储的原因,即便是这种类型的文件也能被其它程序访问,只不过一个程序私有的文件对其他应用是没有访问价值的(恶意程序除外)。外部存储上,应用私有文件的价值在于卸载之后,这些文件也会被删除,类似于内部存储。
在使用外部存储之前,需要先检查外部存储的当前状态,以判断是否可用
boolean mExternalStorageAvailable =false; //外部存储是否可用
boolean mExternalStorageWriteable =false; //外部存储是否可写
String state = Environment.getExternalStorageState(); //获取外部存储状态
if (Environment.MEDIA_MOUNTED.equals(state)) {
//存储媒体已经挂载,并且挂载点可读/写。
mExternalStorageAvailable = mExternalStorageWriteable =true;
}else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
//存储媒体已经挂载,挂载点只读。
mExternalStorageAvailable =true;
mExternalStorageWriteable =false;
}else{
//存储媒体没有挂载。
mExternalStorageAvailable = mExternalStorageWriteable =false;
}
-------------------------------------------------------------------------------------------------------
Environment类中提供了几个静态常量用于标识外部存储的状态,这些状态都是String类型
MEDIA_BAD_REMOVAL 在没有挂载前存储媒体已经被移除。
MEDIA_CHECKING 正在检查存储媒体。
MEDIA_MOUNTED 存储媒体已经挂载,并且挂载点可读/写。
MEDIA_MOUNTED_READ_ONLY 存储媒体已经挂载,挂载点只读。
MEDIA_NOFS 存储媒体是空白或是不支持的文件系统。
MEDIA_REMOVED 存储媒体被移除。
MEDIA_SHARED 存储媒体正在通过USB共享。
MEDIA_UNMOUNTABLE 存储媒体无法挂载。
MEDIA_UNMOUNTED 存储媒体没有挂载。
-------------------------------------------------------------------------------------------------------
Environment中还提供了Android标准目录的路径,以String类型提供。
DIRECTORY_ALARMS 系统提醒铃声存放的标准目录。
DIRECTORY_DCIM 相机拍摄照片和视频的标准目录。
DIRECTORY_DOWNLOADS 下载的标准目录。
DIRECTORY_MOVIES 电影存放的标准目录。
DIRECTORY_MUSIC 音乐存放的标准目录。
DIRECTORY_NOTIFICATIONS 系统通知铃声存放的标准目录。
DIRECTORY_PICTURES 图片存放的标准目录
DIRECTORY_PODCASTS 系统广播存放的标准目录。
DIRECTORY_RINGTONES 系统铃声存放的标准目录。
-------------------------------------------------------------------------------------------------------
static File getDataDirectory() 获得data的目录(/data)。
static File getDownloadCacheDirectory() 获得下载缓存目录。(/cache)
static File getExternalStorageDirectory() 获得外部存储媒体目录。(/mnt/sdcard or /storage/sdcard0)
static File getRootDirectory() 获得系统主目录(/system)
-------------------------------------------------------------------------------------------------------
context.getCacheDir() 获取应用程序自己的缓存目录
context.getExternalCacheDir() 获取应用程序在外部存储的存储目录
这两个方法是通过上下文对象Context获取的,只要应用程序被卸载,这两个目录下的文件都要被清空。