惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园 - herry507

在将 nvarchar 值 '0.00000' 转换成数据类型 int 时失败。 excel VBA点击图片放大缩小 mssql 解析XML 特殊字符造成浏览器显示异常 asysc /wait task 示例执行 MSSQL中解析JSON特殊字符 直接执行与EXCU里执行,竟效果不同 占有率最高的工业总线:PROFINET、Modbus 与 EtherCAT nvarchar和varchar区别 Wappalyzer的分析和欺骗 mssql 中group by cube,rollup,grouping示例 开窗函数进阶last_value特别地方 深入理解 Calculate 函数 如何在Android中获取图片路径 线程间操作无效: 从不是创建控件“******”的线程访问它。 Android 整理常用的第三方库 androids上报表开发 为什么要用模块化、组件化才能完成 Android 项目中类加载功能? android多模块 安卓模块是什么意思 如何使用Android访问文件系统路径 让Android Studo 不编译某个Java文件 Java中list不包含某个元素 java list所在包 转载 解决AS插件与Gradle版本之间的对应问题
android手机文件夹目录结构 手机文件管理目录
herry507 · 2023-10-24 · via 博客园 - herry507

一. 文件存储路径分类

1. 内部存储

内部存储是指在system分区(根目录)下的data/data/package name/下的文件。

这层目录普通用户和程序一般无法直接访问,当前应用的文件也只能当前应用使用,其他应用无法访问。

但是手机经过root之后,获取到了超级权限的话就可以看到这些数据了,获取到root权限的应用可以访问这些数据,并进行操作。但是其他未获得root权限的应用程序依旧无法访问,因此,在内部存储中的文件是最安全的。

卸载应用时,系统会自动清除掉这些文件。

始终可用

2. 外部存储

外部存储是指在/storage/sdcard0/(或/storage/emulated/0/)下的文件,这部分文件才是暴露给用户的文件分区,也就是平时文件管理器能看到的文件.

外部存储对于现在的手机分两种(这两种都是用户可以直接读取的,因此都算作外部存储),如果手机上插有外部的sdcard. 我们的手机Settings里面一般会有一个选项可以选择哪一个作为当前的主存储。

手机自带的外部存储

内存卡等外部存储

外部存储还分为应用数据目录(和内部存储差不多,卸载用时系统会自动清除,差异就在这个用户是可以看见的)和非应用数据目录。

应用数据目录指的是在/storage/sdcard0/Android/data/package name/(或/storage/emulated/0/Android/data/package name/)目录

非应用数据目录指的就是外部存储中除了应用数据目录之外的目录

两者的差异就是卸载应用的时候系统会清除应用数据目录下的文件

不一定始终可用,因为如果外部存储是内存卡这些外接设备的话用户有可能会卸载掉,就不可用了,但是手机自带的外部存储的话一般也是始终可用的。

3. Android存储结构图(转载自Android文件存储总结)

($rootDir)
+- /data -> Environment.getDataDirectory()
| |
| | ($appDataDir)
| +- data/com.srain.cube.sample
| |
| | ($filesDir)
| +- files -> Context.getFilesDir() / Context.getFileStreamPath("")
| | |
| | +- file1 -> Context.getFileStreamPath("file1")
| | ($cacheDir)
| +- cache -> Context.getCacheDir()
| |
| +- app_$name ->(Context.getDir(String name, int mode)
|
| ($rootDir)
+- /storage/sdcard0 -> Environment.getExternalStorageDirectory()
| / Environment.getExternalStoragePublicDirectory("")
|
+- dir1 -> Environment.getExternalStoragePublicDirectory("dir1")
|
| ($appDataDir)
+- Andorid/data/com.srain.cube.sample
|
| ($filesDir)
+- files -> Context.getExternalFilesDir("")
| |
| +- file1 -> Context.getExternalFilesDir("file1")
| +- Music -> Context.getExternalFilesDir(Environment.Music);
| +- Picture -> ... Environment.Picture
| +- ...
|
| ($cacheDir)
+- cache -> Context.getExternalCacheDir()
|

这张图清晰的描述了Android中存储的分类、路径以及访问方式。

二. 应用数据目录详解

应用数据主要分两种类型,持久存储(files,shared_preference,db等)和缓存(cache),区别在于缓存文件并不能保证持久。 系统内存低的时候,系统会优先删除这些缓存文件,而持久存储的文件除非卸载应用,否则是不会删除的。

获取应用数据目录的方法

获取内部存储里的应用持久数据目录(获取的是files目录,不需要任何权限,直接就可以获取)(这里用到Java IO流的东西,得复习)

通过openFileOutput(FILENAME, Context.MODE_PRIVATE)方法,获取到FileOutputStream,可以进行文件输出
FileOutputStream fos = openFileOutput(FILENAME);
fos.write(string.getBytes());
fos.close();
- 通过openFileInput(FILENAME, Context.MODE_PRIVATE)方法,获取到FileOutputStream,可以进行文件读入
- 通过getFilesDir()方法
File file = new File(getFilesDir(), "hello_file2");
if(!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(string.getBytes());
fos.close();
- 两种方法的区别:openFileOutput(Input)返回的是FileOutput(Input)Stream,getFilesDir返回的是File

获取内部存储里的应用缓存数据目录(获取的是cache目录,不需要任何权限,直接就可以获取)

getCacheDir(),返回的还是File对象,对cache目录的操作和file操作一样,只是cache不能保证永久存储而已。

获取外部存储里的用数据目录的方法

先检查外部存储是否可用

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
- **获取外部存储里面的应用永久存储(/storage/emulate/0/Android/package name/files/)目录**(对于外部存储的私有文件的读写,android4.4及以后并不需要声明特别的权限。但是对于4.4以前需要申明WRITE_EXTERNAL_STORAGE 权限.)

getExternalFilesDir(String type)//type可以是DIRECTORY_PICTURES 之类的, 会返回对应的Pictures 文件夹。或者直接传null会直接返回这个目录的文件夹。

- **获取外部存储里面的应用缓存数据(/storage/emulate/0/Android/package name/cache/)目录**

getExternalCacheDir()//不需要参数,直接获取到cache目录

三. 公共存储目录

获取公共存储(/storage/emulated/0/)的方法

公有文件存储必须要声明WRITE_EXTERNAL_STORAGE 权限(危险权限,可能需要动态申请),只是获取路径但是不进行存储的话好像不需要权限。

复制
Environment.getExternalStorageDirectory()//获取到/storage/emulated/0/
Environment.getExternalStoragePublicDirectory("")//获取到/storage/emulated/0/
Environment.getExternalStoragePublicDirectory("path")//获取到/storage/emulated/0/path
-----------------------------------
android手机文件夹目录结构 手机文件管理目录
https://blog.51cto.com/u_16213657/7316954