Android 之文件存储详细介绍

本文详细介绍了Android设备的文件存储,包括内部存储与外部存储的区别,以及如何在不同存储区域进行文件操作。内容涵盖4.4版本前后的变化,强调内部存储的私有性和外部存储的公共性,并提供了相关API的使用示例。
摘要由CSDN通过智能技术生成

文件存储

前言

手机自身带的存储叫机身存储,SD卡存储(小小黑色卡)不能叫机身存储,它和手机是可以分离的。机身存储因手机体统的不同被划分的也不同。

内部存储和外部存储

  • 内部存储
    内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有内部存储文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。
  • 外部存储
    最容易混淆的是外部存储,因为老的Android系统的跟新的Android系统是有差别的,很多人去网上查找资料,看了一下以前的资料,又看了一下现在的资料,但是发现它们说法不一样然后就困惑了。首先说一个大家普遍的概念“如果在pc机上是区分外部存储和内部存储的话,那么电脑自带的硬盘算是内部存储,U盘或者移动硬盘就是外部存储了。”因此很多人带着这样的理解去看待安卓手机,把内置存储(机身存储)当做内部存储,而把扩展的SD卡当做是外部存储。这么认为确实没错,因为在4.4(API19)以前的手机上确实是这样的,手机自身带的存储卡就是内部存储,而扩展的SD卡就是外部存储。但是从4.4的系统开始,很多的中高端机器都将自己的机身存储扩展到了8G以上,比如有的人的手机是16G的,有的人的手机是32G的,但是这个16G,32G是内部存储吗,不是的!它们依然是外部存储,也就是说4.4系统及以上的手机将机身存储存储(手机自身带的存储叫做机身存储)在概念上分成了”内部存储internal” 和”外部存储external” 两部分。既然16G,32G是外部存储,那有人又有疑惑了,那4.4系统及以上的手机要是插了SD卡呢,SD卡又是什么呢,如果SD卡也是外部存储的话,那怎么区分机身存储的外部存储跟SD卡的外部存储呢?对,SD卡也是外部存储,那怎么区分呢,在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卡的话,那么它打印的路径就有两条了,它的结果如下:
com.files是我的应用包名
/storage/emulated/0/Android/data/com.file/files/mounted
/storage/S5X5-1283/Android/data/com.file/files/mounted
其中/storage/emulated/0目录就是机身存储的外部存储路径
/storage/S5X5-1283/就是SD卡的路径 (手机不同结果可能不同)
他们统称为外部存储
注:4.4以前,机身存储就是内部存储,SD卡存储就是外部存储。4.4以后机身存储分为内部存储和外部存储,SD卡属于外部存储。

各方法介绍

直接看代码:

if(v.getId() == R.id.getPath_bt){
    Log.d("TAG 0" , mContext.getApplicationInfo().dataDir);
    Log.d("TAG 1" , mContext.getDataDir().getAbsolutePath());
    Log.d("TAG 2" , mContext.getCacheDir().getAbsolutePath());
    Log.d("TAG 3" , mContext.getFilesDir().getAbsolutePath());
    // 获取默认的数据库
    Log.d("TAG 4" , mContext.getDatabasePath("name").getAbsolutePath());路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值