凯哥Androi缓存文件笔记

来源:互联网 发布:山信软件股份有限公司 编辑:程序博客网 时间:2024/05/16 10:59

以下根据个人理解习惯整理的凯哥的文章APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了

  1. android中,可以向内部存储中的,自己app包名的目录中的files和cache目录写入文件。
  2. 也可以在外部存储中,建立私有的自己app包名的目录,里面也有files和cache两个目录,只是向files目录写进文件只能写到固定的媒体名称目录中,而cache可以随意写。
  3. 当然可以直接拿到外部存储卡的根目录的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作用是一样的,只想的目录是不能随便放入文件的,只能放入指定的文件夹中。

0 0
原创粉丝点击