storage system

------两种操作sd的方式

  String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath();
        Log.i(TAG, "onCreate: Environment.getExternalStorageDirectory().getAbsolutePath() = "+absolutePath);


        String absolutePath1 = getExternalFilesDir(null).getAbsolutePath();

        Log.i(TAG, "onCreate: getExternalFilesDir(null).getAbsolutePath() = "+absolutePath1);
03-31 05:44:46.063 16951-16951/? I/MainActivity: onCreate: Environment.getExternalStorageDirectory().getAbsolutePath() = /mnt/sdcard
03-31 05:44:46.073 16951-16951/? I/MainActivity: onCreate: getExternalFilesDir(null).getAbsolutePath() = /mnt/sdcard/Android/data/com.adnonstop.sd/files


----- google官方文档https://developer.android.google.cn/guide/topics/data/data-storage.html#filesExternal

点击打开链接



 https://developer.android.google.cn/guide/topics/data/data-storage.html#filesExternal

① share_prefs
 SharedPreferences sharep = getSharedPreferences("sharep", MODE_PRIVATE);
        String key = sharep.getString("key", null);
        Log.i(TAG, "btnsharep: sharep value = " + key);

   通过getSharedPreferences("sharep", MODE_PRIVATE);sharep永远非空。

   sharep.getString("key", null);一定会要求defValue,是否为空,看defValue和key对应的value值

   sharep只支持存储int\float\long\boolean\String等5种类型的数据

 ②其他存储方法

 内部存储 cache files shared_prefs

 外部存储 sd(->file | ->cache)
 数据库 sqliteDatabase

③ getDir()
当用户卸载您的应用时,此目录及其内容将被删除。
在您的内部存储空间内创建(或打开现有的)目录。创建和files|cache|share_prefs同级的文件

④ getFilesDir()
当用户卸载您的应用时,此目录及其内容将被删除。
  获取在其中存储内部文件的文件系统目录的绝对路径。在files目录下操作

⑤   lalala = openFileOutput("lalala", MODE_PRIVATE);操作的也是files
⑥   FileInputStream lalala1 = openFileInput("lalala");操作files

⑦ 读取不存在的目录,报异常libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)

⑧ cache
当用户卸载您的应用时,此目录及其内容将被删除。
如果您想要缓存一些数据,而不是永久存储这些数据,应该使用 getCacheDir() 来打开一个 File,它表示您的应用应该将临时缓存文件保存到的内部目录。
当设备的内部存储空间不足时,Android 可能会删除这些缓存文件以回收空间。


⑨ 使用外部存储设备
 该存储可能是可移除的存储介质(例如 SD 卡)或内部(不可移除)存储。
 保存到外部存储的文件是全局可读取文件,而且,在计算机上启用 USB 大容量存储以传输文件后,可由用户修改这些文件。
 sd中文件没权限,可卸载sd卡在pc上操作sd卡。

 getExternalStorageState() 方法将返回您可能需要检查的其他状态(例如介质是否处于共享 [连接到计算]、完全缺失、错误移除等状态)。
 ->保存应用私有文件
 注:当用户卸载您的应用时,此目录及其内容将被删除。
  如果您正在处理的文件不适合其他应用使用(例如仅供您的应用使用的图形纹理或音效),
  则应该通过调用 getExternalFilesDir() 来使用外部存储上的私有存储目录。此方法还会采用 type 参数指定子目录的类型(例如 DIRECTORY_MOVIES)。
  如果您不需要特定的媒体目录,请传递 null 以接收应用私有目录的根目录。

 ->保存可与其他应用共享的文件
 执行此操作时,应使用共享的公共目录之一,例如 Music/、Pictures/ 和 Ringtones/ 等。
 要获取表示相应的公共目录的 File,请调用 getExternalStoragePublicDirectory(),
 向其传递您需要的目录类型,例如 DIRECTORY_MUSIC、DIRECTORY_PICTURES、 DIRECTORY_RINGTONES 或其他类型。
 通过将您的文件保存到相应的媒体类型目录,系统的媒体扫描程序可以在系统中正确地归类您的文件(例如铃声在系统设置中显示为铃声而不是音乐)。
 ->保存缓存文件
 要打开表示应该将缓存文件保存到的外部存储目录的 File,请调用 getExternalCacheDir()。 如果用户卸载您的应用,这些文件也会被自动删除。

十、内部存储、外部存储
http://blog.imallen.wang/blog/2015/09/24/internal-vs-external-storage/
首先要注意的一点就是不要从字面意思上去理解,以为Internal storage即为手机内部存储,External storage是手机外部存储。
其实Internal storage和External storage都要从硬件和软件这两个方面去理解。
1)硬件方面
Internal storage是Internal memory的一个分区,而External storage较为复杂,
它分为两个部分:Primary external storage(可翻译为基础外部存储)和Secondary external storage(可翻译为附加外部存储).
其中Primary external storage也是Internal memory的一个分区,而Secondary external storage则是sd card.
显然,这是一个历史遗留问题,在早期Android版本上,由于flash card价格昂贵,所以采用sd card进行拓展,但是后面随着flash card价格下降,
并且sd card带来很多问题(比如卡顿,数据容易丢失),所以Google和手机产商都在逐步取消sd card,到现在大部分手机已经没有sd card了,
所以现在的External storage基本可以理解成Internal memory的一个特殊分区。

2)软件方面
Internal storage对于app来说是private的,即其他app无权访问,而External storage对于app来说既可能为public,也可能为private的。
具体说就是app的Internal storage位于/data/data/packagename下,而External storage则位于/storagge/emulated/0/下,
其中public external storage的位置一般在/storage/emulated/0/dirname下,
private external storage则位于/storage/emulated/0/Android/data/下。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值