Android File(一) 存储以及File操作介绍
2016-04-07 11:55
609 查看
在开发中,我们或多或少都会使用到File操作,例如,下载图片、资源包、apk等等。那么接下来,我们就看看有关File的一些具体操作。
一.存储说明。
1.在Android中,我们保存数据到手机上,基本上有两种选择,一种是手机内部存储,另一种是外部存储。
(1).手机内部存储(ROM),并不是我们平时所说的手机内存(RAM),它比手机内存要大很多,手机内部存储是手机制造商在手机出厂时,已经确定好的,一旦出厂时无法改变的,例如,介绍手机的时候说16G,32G就是这个内部存储大小(当我们打开手机查看可用空间时,会发现少了几个G,这是因为系统以及其他资源占用了)。我们比较熟悉的目录是,目录1-‘/data/data/应用程序包名’(要看到该目录,手机需要root),手机app的Sqlite数据库、Shared
Preferences、WebView的缓存等都是在该目录中,该目录是系统目录,每当有应用安装后,便会在该目录中创建相应的数据。由于内部存储的大小是确定的,所以,我们在使用时避免在内部存储中大量存储数据。
(2).外部存储,就是我们经常说的,可扩展的存储,例如SD卡、TF卡、TS卡。我们可以在外部存储中,存储各种数据,只要我们的外部存储够大。但是,外部存储不太稳定,当你挂载的时候,可能就用不了了,或者其他原因,总之外部存储在使用前,需要判断外部存储的状态是否可用。我们所熟知的外部存储目录,目录2-‘/sdcard/Android/data/应用程序包名’,该目录是系统创建的,谷歌建议,我们在外部存储时,最好能在该目录下存储。因为当我们在卸载某个应用时,默认情况下,目录1和目录2底下的数据才会自动清除,在其他地方创建的文件或者文件夹,需要手动清除才可以。当然,外部存储对数据的保护较少,所以,建议一些重要的、敏感的数据不应该保存到外部存储中。如果这些数据加密的话,可以选择保存在外部存储。
二.File操作。
1.常用方法。
2.其他常用方法。
PS:在操作SD卡时,记得在AndroidManifest.xml加入以下权限
三.总结
在File操作中,我们需要注意的是,操作完成后,File是否还需要,如果不需要,那么就立刻删除掉,这样也许你的应用会更受欢迎!在 Android File(二) File下载以及解压,这篇文章中我们介绍了有关下载压缩包以及解压。
PS:
一.存储说明。
1.在Android中,我们保存数据到手机上,基本上有两种选择,一种是手机内部存储,另一种是外部存储。
(1).手机内部存储(ROM),并不是我们平时所说的手机内存(RAM),它比手机内存要大很多,手机内部存储是手机制造商在手机出厂时,已经确定好的,一旦出厂时无法改变的,例如,介绍手机的时候说16G,32G就是这个内部存储大小(当我们打开手机查看可用空间时,会发现少了几个G,这是因为系统以及其他资源占用了)。我们比较熟悉的目录是,目录1-‘/data/data/应用程序包名’(要看到该目录,手机需要root),手机app的Sqlite数据库、Shared
Preferences、WebView的缓存等都是在该目录中,该目录是系统目录,每当有应用安装后,便会在该目录中创建相应的数据。由于内部存储的大小是确定的,所以,我们在使用时避免在内部存储中大量存储数据。
(2).外部存储,就是我们经常说的,可扩展的存储,例如SD卡、TF卡、TS卡。我们可以在外部存储中,存储各种数据,只要我们的外部存储够大。但是,外部存储不太稳定,当你挂载的时候,可能就用不了了,或者其他原因,总之外部存储在使用前,需要判断外部存储的状态是否可用。我们所熟知的外部存储目录,目录2-‘/sdcard/Android/data/应用程序包名’,该目录是系统创建的,谷歌建议,我们在外部存储时,最好能在该目录下存储。因为当我们在卸载某个应用时,默认情况下,目录1和目录2底下的数据才会自动清除,在其他地方创建的文件或者文件夹,需要手动清除才可以。当然,外部存储对数据的保护较少,所以,建议一些重要的、敏感的数据不应该保存到外部存储中。如果这些数据加密的话,可以选择保存在外部存储。
二.File操作。
1.常用方法。
//建立文件 File.createNewFile(); //建立文件夹 File.mkDir(); //判断是否是文件 File.isFile(); //判断是否是文件夹 File.isDirectory(); //列出文件夹下的所有文件和文件夹名 File[] files = File.listFiles(); //重命名文件或文件夹 File.renameTo(dest); //删除文件夹或文件 File.delete(); //获得文件或文件夹的名称 String Name = File.getName(); //获得文件或文件夹的父目录 String parentPath = File.getParent(); //获得文件或文件夹的绝对路经 String path = File.getAbsoultePath(); //获得文件或文件夹的路经 String path = File.getPath(); //获得sd卡根目录 File skRoot = Environment.getExternalStorageDirectory();
2.其他常用方法。
/** * 判断SD卡是否被挂载 * * @return */ public static boolean isSDCardMounted() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); } /** * 获取SD卡的根目录 * * @return */ public static String getSDCardBaseDir() { if (isSDCardMounted()) { return Environment.getExternalStorageDirectory().getAbsolutePath(); } return null; } /** * 获取sd卡的大小 * * @return */ @SuppressWarnings("deprecation") public static long getSDAllSizeKB() { if (isSDCardMounted()) { // get path of sdcard File path = Environment.getExternalStorageDirectory(); StatFs sf = new StatFs(path.getPath()); // get single block size(Byte) long blockSize = sf.getBlockSize(); // 获取所有数据块数 long allBlocks = sf.getBlockCount(); // 返回SD卡大小 return (allBlocks * blockSize) / 1024; // KB } return 0; } /** * 获取sd卡可用大小 * * @return */ @SuppressWarnings("deprecation") public static long getSDAvalibleSizeKB() { if (isSDCardMounted()) { File path = Environment.getExternalStorageDirectory(); StatFs sf = new StatFs(path.getPath()); long blockSize = sf.getBlockSize(); long avaliableSize = sf.getAvailableBlocks(); return (avaliableSize * blockSize) / 1024;// KB } return 0; } /** * 获取文件或文件夹的大小 * * @param path * 文件或文件夹的路径 * @return */ public static long getFileSize(String path) { return getFileSize(new File(path)); } /** * 获取文件或文件夹的大小 * * @param file * 文件或文件夹 * @return */ public static long getFileSize(File file) { if (file.exists()) { if (file.isDirectory()) { long size = 0; for (File subFile : file.listFiles()) { size += getFileSize(subFile); } return size; } else { return file.length(); } } else { throw new IllegalArgumentException("File does not exist!"); } } /** * 删除文件或文件夹 * * @param path * 文件或文件夹的路径 */ public static void deleteFile(String path) { deleteFile(new File(path)); } /** * 删除文件或文件夹 * * @param file * 文件或文件夹 */ public static void deleteFile(File file) { if (!file.exists()) { Log.d("The file to be deleted does not exist! File's path is: ", file.getPath()); } else { deleteFileRecursively(file); } } /** * 删除文件或文件夹 * * @param file * 文件或文件夹 */ private static void deleteFileRecursively(File file) { if (file.isDirectory()) { for (String fileName : file.list()) { File item = new File(file, fileName); if (item.isDirectory()) { deleteFileRecursively(item); } else { if (!item.delete()) { Log.d("Failed in recursively deleting a file, file's path is: ", item.getPath()); } } } if (!file.delete()) { Log.d("Failed in recursively deleting a directory, directories' path is: ", file.getPath()); } } else { if (!file.delete()) { Log.d("Failed in deleting this file, its path is: ", file.getPath()); } } }
PS:在操作SD卡时,记得在AndroidManifest.xml加入以下权限
<!--在SDCard中创建与删除文件权限 --> <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!--往SDCard写入数据权限 --> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
三.总结
在File操作中,我们需要注意的是,操作完成后,File是否还需要,如果不需要,那么就立刻删除掉,这样也许你的应用会更受欢迎!在 Android File(二) File下载以及解压,这篇文章中我们介绍了有关下载压缩包以及解压。
PS:
Context.getExternalCacheDir().getPath(); 获取到的是 /sdcard/Android/data/<application package>/cache 这个路径 -目录2 Context.getCacheDir().getPath(); 获取到的是 /data/data/<application package>/cache 这个路径-目录1
相关文章推荐
- android开发系列之数据存储
- Android Studio使用时源码到处报红色警告,运行时又没错
- Android经典开源项目分享发现
- zz:Android基础教程(一)开发环境搭建
- android listview里包含组件(checkbox)点击事件和Item的点击事件冲突
- android:ToolBar详解(手把手教程)
- zz:Android 二维码 生成和识别(附Demo源码)
- zz:Android Studio使用中的常见错误总结
- zz:彻底解决Android SDK Manager更新慢的问题
- zz:如何发布Android应用程序?
- zz:Android 内存溢出(Out Of Memory)的总结
- zz:Android 内存优化测试
- Android Studio failed to resolve .....
- 安卓倒计时
- Android性能
- Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
- Android Touch事件传递机制解析
- 安卓Socket通信
- Android Studio如何自动 import
- 安卓倒计时秒