内容简介:先来看一下我们本章节的思维导图,希望能够帮助你用碎片化或者尽量短的时间,直白、深刻的了解本文的知识点。内部存储控件不需要用户权限,这意味着我们不需要用户去授权我们可以访问/data/data/应用包名,查看自己应用下的内部存储文件。
先来看一下我们本章节的思维导图,希望能够帮助你用碎片化或者尽量短的时间,直白、深刻的了解本文的知识点。
内部存储
是否需要用户权限:否
是否能被其他应用访问:否
卸载应用数据是否被删除:是
内部存储控件不需要用户权限,这意味着我们不需要用户去授权 android.permission.WRITE_EXTERNAL_STORAGE
和 android.permission.READ_EXTERNAL_STORAGE
我们就可以读写该目录下的文件。而且该目录下的文件不能被其他应用访问。这也就保证了我们应用内部存储的文件的安全性和隐私性,如果我们需要查看自己应用内部的文件,我们可以通过Android Studio的 Device File Explore 工具进行访问:
我们可以访问/data/data/应用包名,查看自己应用下的内部存储文件。
/data/data/应用名/cache:存放的是APP的缓存信息
/data/data/应用名/code_cache:在运行时存放应用产生的编译或者优化的代码
/data/data/应用名/files: 存放APP的文件信息
还有一些运行时,产生的文件夹,例如调用SharedPreference所产生的 /data/data/应用包名/shared_prefs 目录,存放着app的SharedPreference所产生的xml文件,还有调用数据库所产生的 **/data/data/应用包名/databases/**文件夹,这里就不一一举例。
相关API
getCacheDir
File getCacheDir() 返回内部存储的cache文件夹
Log.d("DaMai",getCacheDir().getPath()); //data/user/0/com.example.vicky.yinji/cache 复制代码
getCodeCacheDir
File getCodeCacheDir() 返回内部存储的code_cache文件夹,要求Android5.0+
Log.d("DaMai",getCodeCacheDir().getPath()); ///data/user/0/com.example.vicky.yinji/code_cache 复制代码
getFilesDir
File getFilesDir() 访问内部存储的files目录
Log.d("DaMai",getFilesDir().getPath()); ///data/user/0/com.example.vicky.yinji/files 复制代码
fileList
String[] fileList() 返回files目录下的文件名,例如files目录下有test.txt文件和test1.txt文件
//输出 test.txt和test1.txt for (String item : fileList()){ Log.d("DaMai",item); } 复制代码
openFileOutput
FileOutputStream openFileOutput() 写文件到files目录下:
try { FileOutputStream outputStream = openFileOutput("test.txt", Context.MODE_PRIVATE); outputStream.write("this is test content".getBytes()); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } 复制代码
此时file目录下就会多了一个test.txt文件
openFileInput
FileInputStream openFileInput() 读files目录下文件,例如我们读刚刚写入的test.txt文件
// 输出:this is test content try { FileInputStream fileInputStream = openFileInput("test.txt"); byte[] bytes = new byte[1024]; StringBuffer stringBuffer = new StringBuffer(); int len = 0; while ((len=fileInputStream.read(bytes))!=-1){ stringBuffer.append(new String(bytes,0,len)); } Log.d("DaMai",stringBuffer.toString()); fileInputStream.close(); } catch (Exception e) { e.printStackTrace(); } 复制代码
getDataDir
File getDataDir() 返回内部存储的根文件夹,要求Android7.0+
Log.d("DaMai",getDataDir().getPath()); ///data/user/0/com.example.vicky.yinji 复制代码
外部存储
公共目录
是否需要用户权限:是
是否能被其他应用访问:是
卸载应用数据是否被删除:否
公共目录必须需要用户授权读写的权限,这意味着我们需要在 AndroidManifest.xml
中注册用户权限。
<!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 复制代码
并且在Android 6.0系统之后需要申请用户权限,并获得用户授权,才能读写文件。
公共目录相对开放,我们可以访问其他APP存在公共目录下的文件,并且当APP被删除时,并不会删除应用存在公共目录下的文件。
我们可以通过Environment对象,访问读写公共目录的文件。接下来让我们看看相关的API。
相关API
Environment.getExternalStorageDirectory
File Environment.getExternalStorageDirectory() 访问外部存储设备公共根目录:
//输出:/storage/emulated/0 Log.d("DaMai",Environment.getExternalStorageDirectory().getPath()); 复制代码
Environment.getExternalStoragePublicDirectory
File Environment.getExternalStoragePublicDirectory(String type)
我们可以通过type访问公有目录下对应的文件,例如:
//输出:/storage/emulated/0/Music Log.d("DaMai",Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath()); 复制代码
Environment对象为我们提供了丰富的访问对应公有目录下的type,我们可以通过Environment对象源码进行查看,这里不再赘述。
Environment.getExternalStorageState
String Environment.getExternalStorageState() 获得外部存储SD卡的状态,在读写SD卡的时候,我们应该先判断一下SD卡的状态,是否能够支持读写。
具体返回值及对应的状态也可以查看Environment.getExternalStorageState的源码。
私有目录
是否需要用户权限:4.4以上不需要
是否能被其他应用访问:否
卸载应用数据是否被删除:是
私有目录,在Android4.4系统以上。不需要注册和用户授权SD读写的权限,就可以在应用的私有目录进行读写文件。并且文件不能被其他应用所访问,具有较好的隐私性和安全性,并且在用户删除的时候,对应的应用私有目录也会被删除。
私有目录地址:/storage/emulated/0/Android/data/应用包名
相关API
私有目录下访问的API都在ContextWrapper对象上。这意味这我们可以直接在Activity中调用或者通过Context对象去调用。
getExternalCacheDir
File Context.getExternalCacheDir() 访问/storage/emulated/0/Android/data/应用包名/cache目录,该目录用来存放应用的缓存文件,当我们通过应用删除缓存文件的时候,该目录下的文件会被清除。
//输出:/storage/emulated/0/Android/data/com.example.vicky.yinji/cache Log.d("DaMai",this.getExternalCacheDir().getPath()); 复制代码
getExternalFilesDir
File Context.getExternalFilesDir(String type) 访问/storage/emulated/0/Android/data/应用包名/files 目录,该目录用来存放应用的数据,当我们通过应用去清除应用数据的时候,该目录下的文件会被清除。我们也可以通过type,去创建并获得对应目录下的File文件。例如:
//创建并输出:/storage/emulated/0/Android/data/com.example.vicky.yinji/files/test Log.d("DaMai",this.getExternalFilesDir("test").getPath()); 复制代码
我们也可以将type传为null,这时候访问的目录就是files目录,例如:
//输出:/storage/emulated/0/Android/data/com.example.vicky.yinji/files Log.d("DaMai",this.getExternalFilesDir(null).getPath()); 复制代码
复盘
我们开发中经常会进行文件存储,这次我们终于弄清楚了Android的文件存储,当我们需要存储一些私密性和安全性比较高的小数据,例如用户的账号密码等信息,我们可以存放在内部存储空间上;当我们需要存放一些能够被其他应用也能访问的数据,并且当应用被删除的时候,不希望数据被清除的时候,我们可以放到外部存储的公有目录下,但别忘了申请读写SD卡的权限哦;当我们需要存放一些应用的数据和缓存数据,希望有较好的隐私性和应用被删除的时候,对应的应用数据和缓存也被删除,这时候我们可以选择存放在外部存储的私有目录下。
我是大麦,如果喜欢我的文章,请给我一颗小心心。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- [译] 深入理解 Cilium 的 eBPF 收发包路径 (datapath) (KubeCon, 2019)
- 深入解析Java绝对路径与相对路径
- C#/.NET 如何确认一个路径是否是合法的文件路径
- GAC 与其物理路径
- 关键渲染路径优化
- 【Leetcode】62. 不同路径
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Data Structures and Algorithms
Alfred V. Aho、Jeffrey D. Ullman、John E. Hopcroft / Addison Wesley / 1983-1-11 / USD 74.20
The authors' treatment of data structures in Data Structures and Algorithms is unified by an informal notion of "abstract data types," allowing readers to compare different implementations of the same......一起来看看 《Data Structures and Algorithms》 这本书的介绍吧!