android 文件存储调试细节(小米系统)
android文件永久存储一共有两个位置,内部存储和外部存储,这里的存储是指ROM(断电仍保持记忆),不是运行内存(RAM断电记忆丢失)。
这是由现在android手机的存储结构决定的,内部存储就是焊在手机里的闪存空间的一部分,该部分是app的私有空间,没有root的话,其他软件无法读写该部分空间。焊在手机里的闪存一般分为4g,16g,32g,64g,128g,android的手机一般是4g,16g,32g,64g为多,苹果的手机一般是16g,64g,128g三种选择。
外部存储是除了上面提到的app私有的空间外,以及系统占用的一部分焊在手机里的闪存空间外的部分存储空间,而且android手机由于手机用户自行选择插入sdcard这种情况造成了另一部分外部存储空间,如果像苹果那样不能自己插入sdcard,那么就不存在这样的外插sdcard外部存储这种情况.
android实际开发过程中会用到三个地方:
1、internal storage:内部储存,即app私有空间,绝对路径为 “/data/data/app-package-name/”,这部分物理上可以理解为焊在手机里的闪存空间的部分存储空间。
在该目录下会自动创建目录:files,cache,databases,lib,shared_prefs;这些目录因app中产生数据的存储需求而创建,app中没有产生存储需求就可能不产生这些文件夹中的部分。
2、external storage:外部存储空间:焊在手机里的闪存空间的部分,一般绝对路径为:/mnt/shell/emulated/0/(不同系统会有微小的区别,但是对于调用系统提供的函数获得路径而言,这样的区别对编程没有影响),一般该路径可以通过“file:///sdcard/xxx”获得,文件xxx就储存在“/mnt/shell/emulated/0/”目录下。
3、sdcard:外部存储空间,用户自己插入的sdcard,该空间不一定总是存在,所以使用之前需要程序判断是否插入了外部sdcard,外插sdcard根目录的绝对地址为:“/storage/sdcard1/”
为了简化操作,我们只将数据保存在内部存储空间 和 外部存储空间( 焊在手机里),我们可以只将“/data”目录下的存储空间认为是内部存储空间,/mnt/shell/emulated/0 目录下的空间认为是外部存储空间;而且外部存储空间的也分公用的,和私有的
(主要参考:http://www.androidchina.net/4106.html)
internal storage | /data | 由于内部存储空间有限,在开发中我们一般都是操作外部存储空间,Google官方建议我们App的数据应该存储在外部存储的私有 目录中该App的包名下,这样当用户卸载掉App之后,相关的数据会一并删除,如果你直接在/storage/sdcard目录下创建了一个应 用的文件夹,那么当你删除应用的时候,这个文件夹就不会被删除。 |
external storage | /mnt/shell/emulated/0 | 私有:/mnt/shell/emulated/0/Android/data/app_package_name/files /mnt/shell/emulated/0/Android/data/app_package_name/cache 公用:九大公有目录,比如DCIM、DOWNLOAD等这种系统为我们创建的文件夹 |
sdcard | /storage/sdcard1/ |
我们的app在使用空间的路径时,应该使用绝对路径,而不是相对路径,关于绝对路径和相对路径,参考:http://blog.csdn.net/androidwifi/article/details/17725989
下面这些函数的方法获得的都是
1、getFilesDir() = /data/data/com.gsh.gshow/files
2、getExternalFilesDir().getAbsolutePath() = /storage/emulated/0/Android/data/com.gsh.gshow/files
3、Environment.getDownloadCacheDirectory().getAbsolutePath() = /cache
4、Environment.getDataDirectory().getAbsolutePath() = /data
5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0 (->/mnt/shell/emulated/0)
6、Environment.getExternalStoragePublicDirectory("pub_test") = /storage/emulated/0
下面这个类操作的就是External storage:
public class SDCardHelper { // 判断SD卡是否被挂载 public static boolean isSDCardMounted() { // return Environment.getExternalStorageState().equals("mounted"); return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); } // 获取SD卡的根目录 public static String getSDCardBaseDir() { if (isSDCardMounted()) { return Environment.getExternalStorageDirectory().getAbsolutePath(); } return null; } // 获取SD卡的完整空间大小,返回MB public static long getSDCardSize() { if (isSDCardMounted()) { StatFs fs = new StatFs(getSDCardBaseDir()); long count = fs.getBlockCountLong(); long size = fs.getBlockSizeLong(); return count * size / 1024 / 1024; } return 0; } // 获取SD卡的剩余空间大小 public static long getSDCardFreeSize() { if (isSDCardMounted()) { StatFs fs = new StatFs(getSDCardBaseDir()); long count = fs.getFreeBlocksLong(); long size = fs.getBlockSizeLong(); return count * size / 1024 / 1024; } return 0; } // 获取SD卡的可用空间大小 public static long getSDCardAvailableSize() { if (isSDCardMounted()) { StatFs fs = new StatFs(getSDCardBaseDir()); long count = fs.getAvailableBlocksLong(); long size = fs.getBlockSizeLong(); return count * size / 1024 / 1024; } return 0; } // 往SD卡的公有目录下保存文件 public static boolean saveFileToSDCardPublicDir(byte[] data, String type, String fileName) { BufferedOutputStream bos = null; if (isSDCardMounted()) { File file = Environment.getExternalStoragePublicDirectory(type); try { bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName))); bos.write(data); bos.flush(); return true; } catch (Exception e) { e.printStackTrace(); } finally { try { bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return false; } // 往SD卡的自定义目录下保存文件 public static boolean saveFileToSDCardCustomDir(byte[] data, String dir, String fileName) { BufferedOutputStream bos = null; if (isSDCardMounted()) { File file = new File(getSDCardBaseDir() + File.separator + dir); if (!file.exists()) { file.mkdirs();// 递归创建自定义目录 } try { bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName))); bos.write(data); bos.flush(); return true; } catch (Exception e) { e.printStackTrace(); } finally { try { bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return false; } // 往SD卡的私有Files目录下保存文件 public static boolean saveFileToSDCardPrivateFilesDir(byte[] data, String type, String fileName, Context context) { BufferedOutputStream bos = null; if (isSDCardMounted()) { File file = context.getExternalFilesDir(type); try { bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName))); bos.write(data); bos.flush(); return true; } catch (Exception e) { e.printStackTrace(); } finally { try { bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return false; } // 往SD卡的私有Cache目录下保存文件 public static boolean saveFileToSDCardPrivateCacheDir(byte[] data, String fileName, Context context) { BufferedOutputStream bos = null; if (isSDCardMounted()) { File file = context.getExternalCacheDir(); try { bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName))); bos.write(data); bos.flush(); return true; } catch (Exception e) { e.printStackTrace(); } finally { try { bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return false; } // 保存bitmap图片到SDCard的私有Cache目录 public static boolean saveBitmapToSDCardPrivateCacheDir(Bitmap bitmap, String fileName, Context context) { if (isSDCardMounted()) { BufferedOutputStream bos = null; // 获取私有的Cache缓存目录 File file = context.getExternalCacheDir(); try { bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName))); if (fileName != null && (fileName.contains(".png") || fileName.contains(".PNG"))) { bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); } else { bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); } bos.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } return true; } else { return false; } } // 从SD卡获取文件 public static byte[] loadFileFromSDCard(String fileDir) { BufferedInputStream bis = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { bis = new BufferedInputStream(new FileInputStream(new File(fileDir))); byte[] buffer = new byte[8 * 1024]; int c = 0; while ((c = bis.read(buffer)) != -1) { baos.write(buffer, 0, c); baos.flush(); } return baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { try { baos.close(); bis.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } // 从SDCard中寻找指定目录下的文件,返回Bitmap public Bitmap loadBitmapFromSDCard(String filePath) { byte[] data = loadFileFromSDCard(filePath); if (data != null) { Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length); if (bm != null) { return bm; } } return null; } // 获取SD卡公有目录的路径 public static String getSDCardPublicDir(String type) { return Environment.getExternalStoragePublicDirectory(type).toString(); } // 获取SD卡私有Cache目录的路径 public static String getSDCardPrivateCacheDir(Context context) { return context.getExternalCacheDir().getAbsolutePath(); } // 获取SD卡私有Files目录的路径 public static String getSDCardPrivateFilesDir(Context context, String type) { return context.getExternalFilesDir(type).getAbsolutePath(); } public static boolean isFileExist(String filePath) { File file = new File(filePath); return file.isFile(); } // 从sdcard中删除文件 public static boolean removeFileFromSDCard(String filePath) { File file = new File(filePath); if (file.exists()) { try { file.delete(); return true; } catch (Exception e) { return false; } } else { return false; } }}
更多相关文章
- 2015.4.28 北京未名空间信息技术有限公司
- ArcGIS for Android(安卓)离线数据空间分析--叠加分析
- Android模仿QQ空间图片上传——原理
- Android(安卓)获取存储空间
- android studio 构建maven私有库环境搭建
- android——api
- [Android(安卓)SQLite]数据存储与访问 - 内部存储
- libgdx的使用--环境搭建测试
- 详解Android(安卓)9.0 私有API禁用机制