凯哥Androi缓存文件笔记
来源:互联网 发布:山信软件股份有限公司 编辑:程序博客网 时间:2024/05/16 10:59
以下根据个人理解习惯整理的凯哥的文章APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了
- android中,可以向内部存储中的,自己app包名的目录中的files和cache目录写入文件。
- 也可以在外部存储中,建立私有的自己app包名的目录,里面也有files和cache两个目录,只是向files目录写进文件只能写到固定的媒体名称目录中,而cache可以随意写。
- 当然可以直接拿到外部存储卡的根目录的File对象,也可以拿到外部存储卡根目录下固定媒体名称的目录的File对象。
1和2是app私有的,只能自己app访问,卸载app时会一并删除,但是3是公共的,app卸载不会一并卸载。此外cache中文件缓存的用的,存储容量不足会被清除。
1、内部存储
在/data/data/目录下,为每个app,以app包名为目录名创建对应的目录。此目录为app的私有目录,只能被此app访问,当卸载app时,整个目录都会被清除干净。
读取内部存储不需要权限,但是读取或者是写入外部存储需要权限,在现版本里面,读权限不进行声明,也可以实现读取,但是在以后版本可能会修改,所以请务必加上,如果应用需要写入权限,那么只声明写入权限即可,不需要再声明读取权限。
此目录结构为:
这里有Files和Cache两个目录:cache与files的差别在于,如果手机的内部存储控件不够了,会自行选择cache目录进行删除,因此,不要把重要的文件放在cache文件里面,可以放置在files里面,因为这个文件只有在APP被卸载的时候才会被删除。还有要注意的一点是,如果应用程序是更新操作,内部存储不会被删除,区别于被用户手动卸载。
1. 向files目录写入文件
通过getFilesDir()方法
File file1 = new File(this.getFilesDir(), "getFilesDir.txt");Log.d("TAG", "file1=" + file1.getAbsolutePath());try { OutputStream outputStream1 = new FileOutputStream(file1); outputStream1.write("file".getBytes()); outputStream1.close(); } catch (IOException e){ e.printStackTrace(); }
运行结果如下:
D/TAG﹕getFilesDir()=/data/data/com.socks.baidudemo/filesD/TAG:file1=/data/data/com.socks.baidudemo/files/getFilesDir.txt
使用Context的getFilesDir()方法,可以获得指向/data/data/packagename/files目录的File对象。
通过openFileOutput() 方法
try { OutputStream outputStream1 = this.openFileOutput("openFileOutput.txt", MODE_PRIVATE); outputStream1.write("openFileOutput".getBytes()); outputStream1.close(); } catch (IOException e){ e.printStackTrace(); }
Context的openFileOutput() 方法是getFilesDir()简化操作,可以获得/data/data/packagename/files目录的中某文件的FileOutputStream对象。
2. 向cache目录写入文件
File file2 = new File(this.getCacheDir(), "cache.txt");Log.d("TAG", "getCacheDir()=" + file1.getAbsolutePath());try { OutputStream outputStream2 = new FileOutputStream(file1); outputStream2.write("file".getBytes()); outputStream2.close(); } catch (IOException e){ e.printStackTrace(); }
运行结果如下:
D/TAG﹕getCacheDir()=/data/data/com.socks.baidudemo/cacheD/TAG﹕file2=/data/data/com.socks.baidudemo/cache/cache.txt
使用Context的getCacheDir()方法,可以获得指向/data/data/packagename/cache目录的File对象。
2、外部存储
1. 外部存储的状态
与内部存储不同,外部存储的容量一般较大,而且当移动设备连接到PC之后,如果我们开启USB模式与PC连接并操作文件,这个时候外部存储是处于卸载状态的,APP不能对里面的文件进行操作,所以,我们的APP的对外部存储进行操作之前,请先检查外部存储的状态。
/* Check 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;}/* Check if external storage is available to at lease 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;}
2. 外部私有存储
从上面内部存储的介绍来看,内部存储的文件应该属于私有文件,别的APP想要访问是比较困难的,那么外部存储呢?外部存储由于容量较大,一般是我们的APP保存较大文件的不二选择,那么是不是外部存储里面的文件,所有的APP都可以随意访问呢?显然并不是这样的,在外部存储中,也存在着私有文件的概念。
此私有目录存放在/sdcard/Android/date/下,以app包名为目录名。这个Android文件夹是隐藏文件夹,用户无法操作。目录结构为
其实是与内部存储目录是一样的,都有files和cache两个目录,都可以放缓存文件,在APP被卸载的时候,都会被系统删除,而且缓存的内容对其他APP是相对私有的。
1. 向files目录写入文件
File file3 = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "getExternalFilesDir.txt");Log.d("TAG", "file1=" + file1.getAbsolutePath());try { OutputStream outputStream3 = new FileOutputStream(file1); outputStream3.write("getExternalFilesDir".getBytes()); outputStream3.close(); } catch (IOException e){ e.printStackTrace(); }
getExternalFilesDir方法需要指定一个常量:DIRECTORY_MUSIC/DIRECTORY_PODCASTS/DIRECTORY_RINGTONES/DIRECTORY_ALARMS/DIRECTORY_NOTIFICATIONS/DIRECTORY_PICTURES/DIRECTORY_MOVIES,此方法是返回的是,指向files目录下常量指定目录的File对象。这些目录类型参数可以确保那些文件被系统正确的对待。例如,那些以DIRECTORY_RINGTONES 类型保存的文件就会被系统的media scanner认为是ringtone而不是音乐。所以此文件夹内是不能随便放入文件的,只能放入指定的文件夹中。
运行结果:
file3=/storage/emulated/0/Android/data/com.socks.baidudemo/files/Pictures/getExternalFilesDir.txt
2. 向cache目录写入文件
File file4 = new File(this.getExternalCacheDir().getAbsolutePath(), "getExternalCacheDir.txt.txt");Log.d("TAG", "file4=" + file1.getAbsolutePath());try { OutputStream outputStream4 = new FileOutputStream(file4); outputStream4.write("file".getBytes()); outputStream4.close(); } catch (IOException e){ e.printStackTrace(); }
跟getCacheDir()方法使用一样。
运行结果如下:
D/TAG﹕ file4=/storage/emulated/0/Android/data/com.socks.baidudemo/cache/getExternalCacheDir.txt
3. 外部公共存储
如果你的APP产生的文件不需要隐藏,即对用户是可见的,那么你可以把文件放在外部的公共存储文件下面。
我们可以通过下面的代码获取到公共存储目录:/sdcard/
Environment.getExternalStorageDirectory()
getExternalStorageDirectory()方法返回指向/sdcard目录的file对象。
Environment.getExternalStoragePublicDirectory(String type)
getExternalStoragePublicDirectory需要指定一个特定的参数来指定这些public的文件类型,以便于与其他public文件进行分类。参数类型包括DIRECTORY_MUSIC 或者 DIRECTORY_PICTURES.
返回的是/sdcard下对应的目录的File对象。所以此方法和getExternalFilesDir作用是一样的,只想的目录是不能随便放入文件的,只能放入指定的文件夹中。
- 凯哥Androi缓存文件笔记
- Androi App缓存管理
- androi
- 《Androi Studio实战》学习笔记(一)
- androi 适配
- Androi blog
- Androi CheckBox
- androi截屏
- 文件缓存
- 文件缓存
- 缓存文件
- 文件缓存
- 文件缓存
- 文件缓存
- asp.net缓冲学习笔记1--(页面缓存&文件缓存)
- Androi批量删除SD卡某个文件夹上的文件代码实现
- 数据缓存&&文件缓存方法
- PHP缓存之文件缓存
- Android网络框架-Volley(二) 使用进阶
- [心得]AUP Unix编程艺术知识整理
- 第五周 双分支结构
- Ambari学习笔记 --- linux 安装 ambari (非源码包,不用编译)
- C++ Primer学习笔记
- 凯哥Androi缓存文件笔记
- nginx.org的Server names页面翻译
- bellman-ford算法
- autolayout xib scrollView 动态高度 怎么固定
- JAVA基础知识点(七)--内部类(局部内部类、匿名内部类)
- fast_rcnn
- PhoneGap学习记录
- 洛谷 P1272 重建道路
- JSP的静态包含和动态包含详细讲解 (一)