APP开发实战99-Android的内部存储(Internal Storage)

本文详细介绍了Android的内部存储(Internal Storage),包括其特性、读写方式,如getFileDir()、getCacheDir()和openFileOutput()。内部存储的文件默认只对APP本身可访问,卸载时会被清理。建议将重要文件存储在files目录,非持久性数据如缓存在cache目录,以避免系统清理。
摘要由CSDN通过智能技术生成

26 Android的本地存储

(参考:http://blog.csdn.net/zhaokaiqiang1992)

26.1内部存储(InternalStorage)

内部存储空间特性:

这部分空间总是可用的。

这里的文件默认是只能被你的APP所访问的。

当用户卸载APP的时候,系统会把内部存储里面的相关文件都清除干净。

内部存储是想确保不被用户与其他APP所访问的最佳存储区域。

读写内部存储不需要权限。

 

保存到内部存储的方式:

     1 getFileDir() 通过此方法可以获取到你的APP内部存储的文件路径,路径为/data/data/pacgage_name/files

示例代码:

File file1 = new File(getFilesDir(), "getFilesDir.txt");  

        Log.d("TAG", "file1=" + file1.getAbsolutePath());  

  

        try {  

            OutputStream outputStream1 = new FileOutputStream(file1);  

            outputStream1.write("file".getBytes());  

            outputStream1.close();  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

运行输出的Log如下:

file1=/data/data/demo6.qz.com.demo6/files/getFilesDir.txt  

 

2 getCacheDir()通过此方法可以获取到你的APP内部缓存的文件路径,路径为/data/data/package_name/cache

示例代码:

File file2 = new File(getCacheDir(), "cache.txt");  

        Log.d("TAG", "file2=" + file2.getAbsolutePath());  

        try {  

            OutputStream outputStream1 = new FileOutputStream(file2);  

            outputStream1.write("cache".getBytes());  

            outputStream1.close();  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

运行输出的Log如下:

file1=/data/data/demo6.qz.com.demo6/files/getFilesDir.txt  

 

3 openFileOutput()通过此方法,可以获取到一个输出流,输出流的保存路径是/data/data/package_name/files,和getFileDir()的路径一致

示例代码如下

try {  

            OutputStream outputStream = openFileOutput("openFileOutput.txt", MODE_PRIVATE);  

            outputStream.write("openFileOutput".getBytes());  

            outputStream.close();  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

运行结果:

APP的内部存储目录是以APP的包名作为标识存放在Android文件系统的特定目录下[data/data/com.example.xx]。从技术上讲,如果设置文件为可读的,那么其他APP就可以读取这个APP的内部文件。然而,其他APP需要知道此APP的包名与文件名。若是没有设置为可读或者可写,其他APP是没有办法读写的。因此只要使用MODE_PRIVATE模式,那么这些文件就不可能被其他APP所访问。

内部存储区域的数据在APP卸载的时候,会一块被删除,因此,可以在cache目录里面放置图片缓存。

cache与files的差别在于,如果手机的内部存储空间不够了,系统会自行选择cache目录进行删除,因此,不要把重要的文件放在cache文件里面,可以放置在files里面,因为这个文件只有在APP被卸载的时候才会被删除。

用户对APP进行更新操作时,内部存储区域的数据不会被删除,区别于被用户手动卸载。

获取手机存储空间值 private String getInternalMemoryPath() { return Environment.getDataDirectory().getPath(); } /** * * @return 内置sd卡路径 */ private String getExternalMemoryPath() { // return Environment.getExternalStorageDirectory().getPath(); return "/mnt/sdcard"; } /** * * @return 外置sd卡路径 */ private String getSDCard2MemoryPath() { return "/mnt/sdcard1"; } /** * * @param path * 文件路径 * @return 文件路径的StatFs对象 * @throws Exception * 路径为空或非法异常抛出 */ private StatFs getStatFs(String path) { try { return new StatFs(path); } catch (Exception e) { e.printStackTrace(); } return null; } /** * * @param stat * 文件StatFs对象 * @return 剩余存储空间的MB数 * */ private float calculateSizeInMB(StatFs stat) { if (stat != null) return stat.getAvailableBlocks() * (stat.getBlockSize() / (1024f * 1024f)); return 0.0f; } /** * * @return ROM剩余存储空间的MB数 */ private float getAvailableInternalMemorySize() { String path = getInternalMemoryPath();// 获取数据目录 StatFs stat = getStatFs(path); return calculateSizeInMB(stat); } /** * * @return 内置SDCard剩余存储空间MB数 */ private float getAvailableExternalMemorySize() { String path = getExternalMemoryPath();// 获取数据目录 StatFs stat = getStatFs(path); return calculateSizeInMB(stat); } /** * * @return 外置SDCard剩余存储空间MB数 */ private float getAvailableSDCard2MemorySize() { // String status = Environment.getExternalStorageState(); // if (status.equals(Environment.MEDIA_MOUNTED)) { // } String path = getSDCard2MemoryPath(); // 获取数据目录 StatFs stat = getStatFs(path); return calculateSizeInMB(stat); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值