------两种操作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/下。