Android的内部存储和外部存储
2015-08-31 23:21
507 查看
Android内部存储和外部存储
Android 文件系统的操作分为内部存储和外部存储,内部存储就是占用手机内存的空间,外部存储就是占用其他空间。比如SDCard。
录,当程序卸载,这个目录自动删除。内部存储是依赖于应用程序的,因此访问内部存储,必须是应用程序内部的
Context 上下文才可以打开。所以Context中也提供了几个方法方便我们来操作。
实例1:在应用程序的files文件夹下创建一个名称为newfile.txt的文件,并且往里面写入数据
实例2:在Files文件下创建子目录可行吗???
2. 内部存储区中,有一个 cache 文件夹,存储的是临时的缓存文件,应用程序管理器可以通过ClearCache进行缓存的清空;通常都用于软件中“清空缓存”功能;
3. 在 cache 文件夹中的内容,当手机的内部存储空间已经被占满了,Android系统,就会⾃自动删除所有程序内部的 cache文件夹的内容。
4. 如果希望文件不被自动删掉,那么就存储在files目录。
5. 手机内部存储区还是比较小的,建议使用存储卡进行文件的存储。
可能不同。在进行访问的时候,需要添加读取权限。
读权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
写权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,
一般我们写个写权限就OK了,据说以后可用要求开发者这两样都得加上,但是现在写一个就可以了。存储卡可能有,也可能没有,需要在处理外部存储的时候,需要进行判断,当前是否有存储卡。
下面看几个Environment的API
1.所有存储卡操作,都需要先进行判断有没有存储卡,下面这个方法用于判断存储卡的状态
public static String getExternalStorageState ()
2、获得外部存储的根目录 ----/storage/emulated/0 第0个
public static File getExternalStorageDirectory ()
3、获取存储卡某个特定的文件,比如音乐、视频、图片。。。
public static File getExternalStoragePublicDirectory (String type)
type的类型有:DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES,DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS,DIRECTORY_PICTURES,
DIRECTORY_MOVIES,DIRECTORY_DOWNLOADS, or DIRECTORY_DCIM. Maynot be null.
4.获取私有的程序目录,如果参数传入null,结果是files目录,路径是/storage/emulated/0/Android/data/包名/files,
如果参数传入是个特定的字符串,比如wangjing,结果是files目录的子目录,路径是/storage/emulated/0/Android/data/包名/files/wangjing
public File getExternalFilesDir (String type)
Android 文件系统的操作分为内部存储和外部存储,内部存储就是占用手机内存的空间,外部存储就是占用其他空间。比如SDCard。
一、内部存储
内部存储的目录,只有自己应用程序才能访问,其他应用程序不能访问,这个目录就是/data/data/<包名> 这个目录,当程序卸载,这个目录自动删除。内部存储是依赖于应用程序的,因此访问内部存储,必须是应用程序内部的
Context 上下文才可以打开。所以Context中也提供了几个方法方便我们来操作。
实例1:在应用程序的files文件夹下创建一个名称为newfile.txt的文件,并且往里面写入数据
private void writeSomeThing2Dir() { File filesDir = getFilesDir(); if(!filesDir.exists()){ filesDir.mkdir(); } File newFile=new File(filesDir,"newfile.txt"); if(!newFile.exists()){ try { newFile.createNewFile(); FileOutputStream fos=new FileOutputStream(newFile); fos.write("不得了".getBytes()); fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
实例2:在Files文件下创建子目录可行吗???
private void makeSubDirectory() { File filesDir = getFilesDir(); File image=new File(filesDir,"image"); if(!image.exists()){ image.mkdirs(); } try { //错误,这个方法只能打开files目录下的一级目录的文件 FileOutputStream fos = openFileOutput("image/1.txt", MODE_PRIVATE); } catch (FileNotFoundException e) { e.printStackTrace(); } }
二、内部存储区的特点
1. 当应用程序被卸载的时候,应用程序手机内部存储区的文件,全部被删除;2. 内部存储区中,有一个 cache 文件夹,存储的是临时的缓存文件,应用程序管理器可以通过ClearCache进行缓存的清空;通常都用于软件中“清空缓存”功能;
3. 在 cache 文件夹中的内容,当手机的内部存储空间已经被占满了,Android系统,就会⾃自动删除所有程序内部的 cache文件夹的内容。
4. 如果希望文件不被自动删掉,那么就存储在files目录。
5. 手机内部存储区还是比较小的,建议使用存储卡进行文件的存储。
三、外部存储
外部存储就是通常所有的Android程序都能够进行访问的,类似于存储卡的文件系统。存储卡存储目录:/mnt/sdcard,或者 /storage/sdcard。手机上和模拟器上可能不同。在进行访问的时候,需要添加读取权限。
读权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
写权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,
一般我们写个写权限就OK了,据说以后可用要求开发者这两样都得加上,但是现在写一个就可以了。存储卡可能有,也可能没有,需要在处理外部存储的时候,需要进行判断,当前是否有存储卡。
下面看几个Environment的API
1.所有存储卡操作,都需要先进行判断有没有存储卡,下面这个方法用于判断存储卡的状态
public static String getExternalStorageState ()
2、获得外部存储的根目录 ----/storage/emulated/0 第0个
public static File getExternalStorageDirectory ()
3、获取存储卡某个特定的文件,比如音乐、视频、图片。。。
public static File getExternalStoragePublicDirectory (String type)
type的类型有:DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES,DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS,DIRECTORY_PICTURES,
DIRECTORY_MOVIES,DIRECTORY_DOWNLOADS, or DIRECTORY_DCIM. Maynot be null.
4.获取私有的程序目录,如果参数传入null,结果是files目录,路径是/storage/emulated/0/Android/data/包名/files,
如果参数传入是个特定的字符串,比如wangjing,结果是files目录的子目录,路径是/storage/emulated/0/Android/data/包名/files/wangjing
public File getExternalFilesDir (String type)
四、文件存储的最佳实践
关于文件操作,在应用中一般都会有一个清除缓存这个功能,这个功能就是文件操作实现的:显示缓存大小,要递归循环缓存文件夹下所有文件大小,然后求和。清除缓存,要递归删除文件。注意:递归删除代码和获取缓存大小代码,这个两个方法要在子线程中做。/** * 递归删除文件和文件夹 * * @param file 要删除的根目录 */ public static void recursionDeleteFile(File file) { if (file.isFile()) { file.delete(); return; } if (file.isDirectory()) { File[] childFile = file.listFiles(); if (childFile == null || childFile.length == 0) { file.delete(); return; } for (File f : childFile) { recursionDeleteFile(f); } } } /* @param f * @return * @throws Exception */ public static long getFileSize(File f) throws Exception { long size = 0; File flist[] = f.listFiles(); if (flist != null) for (int i = 0; i < flist.length; i++) { File subFile = flist[i]; if (subFile.isDirectory()) { size = size + getFileSize(subFile); } else { size = size + subFile.length(); } } return size; }
相关文章推荐
- <Android>界面美化的一点点积累
- Android Activity Task taskAffinity launchMode 之间的关系
- <Android>递归删除文件夹中的文件以及文件夹
- Android控件之SlidingDrawer(滑动式抽屉)详解与实例
- Android项目开发实战:2D翻转
- Android发送邮件
- Android获取当前电量信息(BroadcastReceiver的使用)
- <Android>Activity生命周期
- 响应能力总结--Android
- Getting Started Android
- Android简单练习(TableLayout)
- Android中webview和js之间的交互及注意事项
- 感悟:分分钟搞定上拉刷新,下拉加载 Android新手
- android studio对从其他地方拷的代码报非法字符
- android传感器sensor
- 我的有史以来的第一篇博客 ——记录android学习之路
- android内核剖析 Context理解读书笔记
- eeyes总结
- android内核剖析 Framework 读书笔记
- Android Api Demos登顶之路(五十四)Service IsolateService Controller