Android 常见的存储文件路径的作用及获取方式(一)
- 内存储
1.1 内部存储
内部存储不是指的内存,而是指的是手机根目录的下data/data文件夹,除非root后的手机,否者用户没有权限去观看这个目录下的文件。
内部存储保存的文件会随着app地卸载而删除。
1.2 内部存储的几个主要的文件- cache app安装后,就会自动生成的文件,存放app的一些缓存文件
- database 存放app创建的数据库相关的文件
- files 存放普通的文件。
- share_prefs 存放SharedPreferences设置的key-value文件的相关的数据
- 外存储
2.1 外存储
外部存储有两种,一种是手机额外挂载的tf卡,一种是手机出厂的时候,已经嵌入到主板的那种存储卡。在手机上看到Storage/emulated 就是外存储。
2.2 外存储的组成-
外存储的私有目录
路径:/storage/emulated/0/Android/data/包名/ -
外存储的共有目录
路径:/storage/emulated/0/xx/ 。其中xx是以下几种 :Alarms、DCIM、Download、Movies、Music、Notifications、Picture、Podcast、Ringtones.
-
3.路径的获取
其实路径可以分为两大类
- 带包名的路径
带包名的路径和某个app相关,这类路径的获取我们需要使用Context方法。
路径 | 获取方法api | 版本 |
---|---|---|
/data/data/com.example.filepathdemo/files | this.getFilesDir().getAbsolutePath() | 内部私有 |
/data/data/com.example.filepathdemo/cache | this.getCacheDir().getAbsolutePath() | 内部私有 |
/storage/sdcard/Android/data/com.example.filepathdemo/cache | this.getExternalCacheDir().getAbsolutePath() | 外部私有 |
/storage/sdcard/Android/data/com.example.filepathdemo/files/Pictures | this.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath() | 外部私有 |
files下包含多种类型的文件,Environment.DIRECTORY_PICTURES只是其中之一,还有如Environment.DIRECTORY_MUSIC,Environment.DIRECTORY_DOWNLOADS等
-
不带包名的路径
由Environment类进行获取相关的数据。
路径 | 获取方法api | 版本 |
---|---|---|
/storage/sdcard/Pictures | Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() | 外部公有 |
共有目录下,系统会自动生成多种类型的文件夹。它们是:
- Alarms
- DCIM
- Download
- Movies
- Music
- Notifications
- Pictures
- Podcasts
- Ringtones
建议:尽量不要将大量的数据写入内部存储中。应用私有的数据尽量的写进私有目录中,一则他们可以随着app的卸载而删除,二来更安全一些。对于一些多媒体文件,如果不要求随着app的卸载而删除,建议将这些多媒体文件,按照类型存储到外部存储的相应的公共目录下。
4.其他
-
mnt/sdcard和sdcard的区别?
sdcard其实就是一个mnt/sdcard的的一个快捷方式,就类似与window的桌面的快捷方法,它指向mnt/sdcard目录,所以两者的内容是相同的。
5.创建文件
- 在内存储的私有目录中创建文件,路径如下data/data/包名/files/zwk/Mytxt.txt.
File innerFile = new File(this.getFilesDir(), "zwk"); // 在内存储中新new一个'zwk'的文件夹对象
if (!innerFile.exists()) { // 判断文件夹是否存在
innerFile.mkdirs(); // 创建文件夹
}
File textFile = new File(this.getFilesDir() + File.separator + "zwk", "MyTxt.txt"); //在zwk文件夹下创建txt文件对象
if (!textFile.exists()) { // 判断MyTxt文件是否存在
try {
textFile.createNewFile(); // 不存在就创建一个新的
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fileOutputStream = null;
try {
fileOutputStream=new FileOutputStream(textFile); // 获取MyTxt.txt文件输出流
fileOutputStream.write("测试数据".getBytes()); // 向MyTxt.txt内部写入数据
fileOutputStream.flush();
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fileOutputStream!=null){
try {
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}