Android 的存储分为三类:内存、内置|外置SD 卡,应用安装后,系统会根据应用的包名在内存创建一个/data/data/包名/的文件夹,默认私有的,用于存储一些简单的文本数据或者二进制数据.
我们知道直接File file = new File(“info.txt”);
会报文件找不到的异常,因为这样写会被创建到手机内部存储的根目录里面,但是内部存储根目录是只读不可写的。
优化:File file = new File(getFileDir(),“info.txt”);
目录:/data/data/<包名>/files/info.txt--->getFileDir()+”info.txt”
一、 files
1. Context.getFilesDir(),该方法返回/data/data/youPackageName/files的File对象。
2. Context.openFileInput()与Context.openFileOutput(),只能读取和写入files下的文件,返回的是FileInputStream和FileOutputStream对象。
3. Context.fileList(),返回files下所有的文件名,返回的是String[]对象。
4. Context.deleteFile(String),删除files下指定名称的文件。
5. Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/youPackageName/files/ 目录,一般放一些长时间保存的数据
二、cache
1. Context.getCacheDir(),该方法返回 /data/data/youPackageName/cache的File对象,当存储空间不足,系统自动将之清除。
2. Context.getExternalCacheDir(),该方法返回 SDCard/Android/data/youPackageName/cache/目录,一般存放临时缓存数据,当我们使用外部存储时,应该先判断外部存储介质是否存在,同时还要加入对sd卡的读写权限。
三、shared_prefs
context.getSharedPreferences(name,mode)//该方法返回 data/data/包名/shared_prefs 的SharedPreferences对象
context.deleteSharedPreferences(name)
四、databases
context.getDataDir() 该方法返回data/data/包名/databases对象
context.getDatabasePath(name)
context.deleteDatabase(name)
五、custom dir
getDir(String name, int mode),返回 /data/data/youPackageName/ 下的指定名称的文件夹File对象,如果该文件夹不存在则用指定名称创建一个新的文件夹。
六、文件权限
MODE_PRIVATE:说明该文件只能被当前的应用程序所读写
MODE_APPEND:以追加方式打开该文件,应用程序可以向该文件中追加内容。
MODE_WORLD_READABLE:该文件的内容可以被其他的应用程序所读取
MODE_WORLD_WRITEABLE:该文件的内容可以被其他的应用程序所读、写
在SD卡中存数据尽量在getExternalStorageDirectory()文件下.应用删除时会清空此文件夹下数据
常用的
context.getExternalFilesDir(type) ///storage/emulated/0/Android/data/应用包名/files
context.getExternalCacheDir() ///storage/emulated/0/Android/data/应用包名/cache
应用设置中清除缓存 ->清除APP运行过程中所产生的临时数据
应用设置中清除数据 ->清除数据才是真正的删除了本地保存的数据(/data/user/0/packname/和/storage/emulated/0/Android/data/packname/文件里的数据会全部删除,包括cache,files,lib,db , shared_prefs等)
不同系统的sd卡路径不同参考 https://blog.csdn.net/u010937230/article/details/73303034/
参考:https://www.jianshu.com/p/80e10b3dbba5