Android 文件相关

 

外部存储external storage和内部存储internal storage

 

访问外部存储的权限

 

从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。

从Android 4.1开始,读操作受权限READ_EXTERNAL_STORAGE保护。

从Android 4.4开始,应用可以管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。

比如,一个包名为com.example.foo的应用,可以自由访问外存上的Android/data/com.example.foo/目录。

 

外部存储对数据提供的保护较少,所以系统不应该存储敏感数据在外部存储上。

特别地,配置和log文件应该存储在内部存储中,这样它们可以被有效地保护。

 

对于多用户的情况,一般每个用户都会有自己独立的外部存储,应用仅对当前用户的外部存储有访问权限。

 

申请权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

 

internal storage  内部存储

内部存储不是内存,是位于位于系统磁盘中一个独特的位置。/data/ 文件夹就是内部存储,内部存储中一般存储一些应用的数据,如apk,shareprefence、database数据,webview缓存和图片缓存等。内部存储中还有一个文件夹每个应用都只有一个,里面中数据在应用卸载之后,就会被删除。结构如:/data/data/你的应用的包名/。其次还有一个 /data/app/ 的文件夹,这里面存储着我们手机上安装的apk文件。
 

特点

 

  • 内部存储的文件和目录只能被我们的app自己所访问,别的app不能访问。
  • 内部存储中的私有目录,当用户卸载app之后,改文件目录中关于该应用的信息就会被删除。
  • 内部存储是可用的。
  • 内部存储大小有限,不适合存储大量数据。
  • 只有root的手机,才能从手机文件管理器看见,否则都是隐藏着的。

 

Context.getCacheDir();        该方法返回/data/data/包名/cache的File对象   这个文件里面的数据在设备内存不足的时候,会被系统删除数据。注意:你不能依赖系统帮你删除这些文件,当这个文件夹里面的数据超过1MB的时候,系统会删除这个文件夹里面的数据。

Context.getFilesDir()          该方法返回/data/data/youPackageName/files的File对象

 

external storage 外部存储

外部存储并不是指拓展的SD卡,不管有无外接设备,每个Android手机都有外部存储。一般的mnt或者storage目录。外部存储中分两类目录,私有目录和公有目录,私有目录的数据会随着应用的卸载而删除,公有目录则不会。

特点

  • 公有目录任何程序都可以访问,私有目录自身可以访问。
  • 并不一定是可用的,因为SD卡会被挂载。
  • 外部存储中的私有目录中的数据会随着应用的卸载而删除,公有目录则不会。

 

公有目录

公有目录是任何程序都可以访问

需要申请读写权限

可以通过两种方法获取

1.

File sdCard = Environment.getExternalStorageDirectory();

这个sdCard的路径为mnt/sdcard/ 即为SD卡根路径,我们可以指定访问的文件夹名

File sdCard = Environment.getExternalStorageDirectory();
File directory_pictures = new File(sdCard, "Pictures");
Log.i(TAG,"directory_pictures="+directory_pictures);

得到的路径如下: directory_pictures=/mnt/sdcard/Pictures

 

2.

File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Log.e(TAG, "directory_pictures="+directory_pictures);

得到的路径如下:directory_pictures=/mnt/sdcard/Pictures

第二种方法是一个更加方便的访问Android给我们提供好的一些公共目录的方法,第一种方式更加灵活,可以自己指定目录。

 

通过Environment.getExternalStoragePublicDirectory(String type)来获取这些目录      /storage/emulated/0/  (/mnt/sdcard/)

type:

DIRECTORY_MUSIC   音乐  /storage/emulated/0/Music

DIRECTORY_PODCASTS   播客  /storage/emulated/0/Podcasts

DIRECTORY_RINGTONES    铃声  /storage/emulated/0/Ringtones

DIRECTORY_ALARMS   闹钟/storage/emulated/0/Alarms

DIRECTORY_NOTIFICATIONS   通知/storage/emulated/0/Notifications

DIRECTORY_PICTURES    图片/storage/emulated/0/Pictures

DIRECTORY_MOVIES   电影/storage/emulated/0/Movies

DIRECTORY_DOWNLOADS   下载文件存储路径/storage/emulated/0/Download

DIRECTORY_DCIM   媒体文件/storage/emulated/0/DCIM

DIRECTORY_DOCUMENTS   文档/storage/emulated/0/Documents

 

私有目录

外部存储中的私有目录是不会自动创建的,需要开发者自己创建,私有目录应用本身无需申请动态权限,就能直接访问。我们可以在私有目录下新建我们自己的文件夹

getExternalFilesDir(“files目录的子目录名称”)

/storage/emulated/0/Android/data/包名/files/子目录       一般放一些长时间保存的数据

getExternalCacheDir()

/storage/emulated/0/Android/data/包名/cache      一般存放临时缓存数据

 

从KITKAT 即Android 4.4开始,如果你的应用只是需要存储一些内部数据,可以考虑使用 :

getExternalFilesDir(String)或者getExternalCacheDir(),它们不需要获取权限。

从Android 4.4这两个方法不需要读写权限,是针对于本应用来说,如果要访问其他应用的相关目录,还是需要声明读写权限。

Android 4.4之前的版本要访问的话还是要声明读写权限的,如果没有在manifest中写权限,上面两个get方法都会返回null。

 

 

有些时候我们的手机没有安装SD卡,所以我们使用前需要判断一下:

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        //SD卡已装入
    }

 

 

https://blog.csdn.net/GD_W001/article/details/84027257

https://blog.csdn.net/nugongahou110/article/details/48154859

https://www.cnblogs.com/awkflf11/articles/5178141.html

https://www.cnblogs.com/mengdd/p/3742623.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值