您的位置:首页 > 移动开发 > Android开发

Android的内部存储和外部存储

2015-08-31 23:21 507 查看
Android内部存储和外部存储

   Android 文件系统的操作分为内部存储和外部存储,内部存储就是占用手机内存的空间,外部存储就是占用其他空间。比如SDCard。

一、内部存储

内部存储的目录,只有自己应用程序才能访问,其他应用程序不能访问,这个目录就是/data/data/<包名> 这个目

录,当程序卸载,这个目录自动删除。内部存储是依赖于应用程序的,因此访问内部存储,必须是应用程序内部的

Context 上下文才可以打开。所以Context中也提供了几个方法方便我们来操作。



实例1:在应用程序的files文件夹下创建一个名称为newfile.txt的文件,并且往里面写入数据

private void writeSomeThing2Dir() {
File filesDir = getFilesDir();
if(!filesDir.exists()){
filesDir.mkdir();
}
File newFile=new File(filesDir,"newfile.txt");
if(!newFile.exists()){
try {
newFile.createNewFile();
FileOutputStream  fos=new FileOutputStream(newFile);
fos.write("不得了".getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


实例2:在Files文件下创建子目录可行吗???

private void makeSubDirectory() {
File filesDir = getFilesDir();
File image=new File(filesDir,"image");
if(!image.exists()){
image.mkdirs();
}
try {
//错误,这个方法只能打开files目录下的一级目录的文件
FileOutputStream fos = openFileOutput("image/1.txt", MODE_PRIVATE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}


二、内部存储区的特点

1. 当应用程序被卸载的时候,应用程序手机内部存储区的文件,全部被删除;

2. 内部存储区中,有一个 cache 文件夹,存储的是临时的缓存文件,应用程序管理器可以通过ClearCache进行缓存的清空;通常都用于软件中“清空缓存”功能;

3. 在 cache 文件夹中的内容,当手机的内部存储空间已经被占满了,Android系统,就会⾃自动删除所有程序内部的 cache文件夹的内容。

4. 如果希望文件不被自动删掉,那么就存储在files目录。

5. 手机内部存储区还是比较小的,建议使用存储卡进行文件的存储。

三、外部存储

外部存储就是通常所有的Android程序都能够进行访问的,类似于存储卡的文件系统。存储卡存储目录:/mnt/sdcard,或者 /storage/sdcard。手机上和模拟器上

可能不同。在进行访问的时候,需要添加读取权限。

读权限: 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
写权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,

一般我们写个写权限就OK了,据说以后可用要求开发者这两样都得加上,但是现在写一个就可以了。存储卡可能有,也可能没有,需要在处理外部存储的时候,需要进行判断,当前是否有存储卡。

下面看几个Environment的API

1.所有存储卡操作,都需要先进行判断有没有存储卡,下面这个方法用于判断存储卡的状态

public static String getExternalStorageState ()

2、获得外部存储的根目录  ----/storage/emulated/0  第0个

public static File getExternalStorageDirectory ()

3、获取存储卡某个特定的文件,比如音乐、视频、图片。。。

public static File getExternalStoragePublicDirectory (String type)

type的类型有:DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES,DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS,DIRECTORY_PICTURES,
DIRECTORY_MOVIES,DIRECTORY_DOWNLOADS, or DIRECTORY_DCIM. Maynot be null.

4.获取私有的程序目录,如果参数传入null,结果是files目录,路径是/storage/emulated/0/Android/data/包名/files,

如果参数传入是个特定的字符串,比如wangjing,结果是files目录的子目录,路径是/storage/emulated/0/Android/data/包名/files/wangjing

public File getExternalFilesDir (String type)

四、文件存储的最佳实践

关于文件操作,在应用中一般都会有一个清除缓存这个功能,这个功能就是文件操作实现的:显示缓存大小,要递归循环缓存文件夹下所有文件大小,然后求和。清除缓存,要递归删除文件。注意:递归删除代码和获取缓存大小代码,这个两个方法要在子线程中做。

/**
* 递归删除文件和文件夹
*
* @param file 要删除的根目录
*/
public static void recursionDeleteFile(File file) {
if (file.isFile()) {
file.delete();
return;
}
if (file.isDirectory()) {
File[] childFile = file.listFiles();
if (childFile == null || childFile.length == 0) {
file.delete();
return;
}
for (File f : childFile) {
recursionDeleteFile(f);
}
}
}

/* @param f
* @return
* @throws Exception
*/
public static long getFileSize(File f) throws Exception {
long size = 0;
File flist[] = f.listFiles();
if (flist != null)
for (int i = 0; i < flist.length; i++) {
File subFile = flist[i];
if (subFile.isDirectory()) {
size = size + getFileSize(subFile);
} else {
size = size + subFile.length();
}
}
return size;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: