Android内部存储和外部存储

Android4.4之后:
运行内存(运存):手机程序是在RAM存储器中读写的,读写速度也与手机的性能有属关,更大的内存可以给手机带来更多的缓冲空间,
随着系统本身和应用程序本身的扩展,ram内存的作用更加明显。

机身存储(内存):使用半导体存储器单元,包括随机存取存储器(RAM)、只读存储器(ROM)和高速缓存。

例如8G+128G的手机 ,8G其实是手机的运行内存(运存)简称RAM;而128G则是手机的机身存储(内存),简称ROM。

Android4.4及以上系统,机身存储分为内部存储和外部存储:

内部存储
一般用Context来获取和操作。
访问内部存储的API方法:
1、Environment.getDataDirectory()
2、getFilesDir().getAbsolutePath()
3、getCacheDir().getAbsolutePath()
4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath()

外部存储
在4.4以后的系统中,API提供了这样一个方法来遍历手机的外部存储路径:
File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
for(File file:files){
Log.e(“main”,file);
}
}

如果你的手机插了SD卡的话,那么它打印的路径就有两条了,例如我的华为荣耀7插了SD卡,它的结果如下:
/storage/emulated/0/Android/data/packname/files/mounted
/storage/B3E4-1711/Android/data/packname/files/mounted
其中/storage/emulated/0目录就是机身存储的外部存储路径
而/storage/B3E4-1711/就是SD卡的路径(也属于外部储存)

访问外部存储的API方法:
1、Environment.getExternalStorageDirectory().getAbsolutePath()
2、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath()
3、getExternalFilesDir(“”).getAbsolutePath()
4、getExternalCacheDir().getAbsolutePath()

很显然应该用外部存储的,因为内部存储本身就比较小,而且已经存储了一些系统的文件,因此内部存储我们尽量不要去使用。
但是当手机没有外部存储时,我们还是得使用内部存储,一般程序员会做判断是否有外部存储,没有再使用内部存储,代码如下:

public static String getFilePath(Context context,String dir) {
String directoryPath="";
if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {//判断外部存储是否可用
directoryPath =context.getExternalFilesDir(dir).getAbsolutePath();
}else{//没外部存储就使用内部存储
directoryPath=context.getFilesDir()+File.separator+dir;
}
File file = new File(directoryPath);
if(!file.exists()){//判断文件目录是否存在
file.mkdirs();
}
return directoryPath;
}

总结:
其中sdcard/、mnt/sdcard、storage/sdcard0、storage/emulated/0、storage/emulated/legacy都是同一个路径的不同”指针“,
指向的是同一个地方,只是不同Android版本的叫法不一样。

getExternalStorageDirectory()和getExternalFilesDir()的区别

app专属文件就是那些只有该app才可以使用的文件,例如专属格式的电子书,app独立文件就是那些不依赖于某特定app的文件,例如照片。

App独立文件
这类文件当我们删除应用之后,还应该保留在手机上的,例如拍照的照片,不应该随着删除应用而被删除掉。
对于这类文件,Android给我们提供了特定的目录,这些目录都是以DIRECTORY开头的,
例如:DIRECTORY_MUSIC , DIRECTORY_PICTURES.

访问这些文件夹有两种方式:
第一种:(更加灵活,可以自己指定目录。)

File sdCard = Environment.getExternalStorageDirectory(); //获得的是外部储存的根路径
File directory_pictures = new File(sdCard, “Pictures”); //我们可以指定访问的文件夹名;
Log.i(TAG,“directory_pictures=”+directory_pictures);

打印为:directory_pictures=storage/emulated/0/Pictures

第二种:(更加方便的访问Android给我们提供好的一些公共目录的方法)

File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);//这里指定为pictures
Log.e(TAG, “directory_pictures=”+directory_pictures);

打印为:directory_pictures=storage/emulated/0/Pictures

mkdir与mkdirs的区别:
boolean mkdir() : 创建此抽象路径名指定的目录。
boolean mkdirs() : 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。

mkdir():只能创建一层目录, 如:

File file = new File(“e:/test”);
file.mkdir();
这样会在e:/路径下创建test目录.

mkdirs(): 创建多层目录,如:
File file = new File(“e:/test/0930”);
file.mkdirs();
这样才能在e:/test/路径下创建0930目录,mkdir这里就不生效了。

storage/emulated/0/iflytek/packagename/Temp/Widget
storage/emulated/0/iflytek/packagename/Temp/Widget/.nomedia

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值