2018-01-13

<pre class="western" style="background: #272822">File dataDirectory = Environment.getDataDirectory();
File downloadCacheDirectory = Environment.getDownloadCacheDirectory();
File externalStorageDirectory = Environment.getExternalStorageDirectory();
File externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory("type");</pre>

adb shell 之后,进到android 设备的文件系统里面,ls列出来的就是整个设备的文件系统。

image.png

问题1:storage 和 sdcard的区别是什么?

/storage/sdcard,是sdcard的分区

/sdcard,是/mnt/sdcard的符号链,指向/mnt/sdcard

Android 4.0 以下是/mnt/sdcard,4.0 以上是/storage/sdcard0

存储选择根据特定的需要,比如待存储的数据是否只与允许本应用使用,是否可被其他应用或用户访问,以及数据需要多大空间。可以有五种存储方式:

  • Shared Preferences

存储原始的key-value对的数据

  • Internal Storage

在设备内存里存放私有数据

  • External Storage

在共享外存里存放共有数据

  • SQLite Databases

    在私有db里存放结构化的数据

  • Network Connection

    在自己的网络服务器上存放数据

Android 提供一种暴露自己的私有数据给其他应用的方法——Content Provider,可以开放其他应用对该数据的读写权限。

一,使用Internal Storage

默认地,保存在internal storage的文件只能被本应用访问,其他应用和用户都无法访问。当应用卸载后,这些文件就被清除了。

<pre class="western" style="background: #272822">private void testWriteFile() {
String FILENAME = "my_file";
String fileContent = "hello, internal file";
FileOutputStream fos = null;
try {
fos = openFileOutput(FILENAME, MODE_PRIVATE);
fos.write(fileContent.getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void testReadFile() {
String FILENAME = "my_file";
try {
FileInputStream fis = openFileInput(FILENAME);
byte[] bytes = new byte[fis.available()];
fis.read(bytes);
System.out.println(new String(bytes));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}</pre>

注意1:我们还可以读取raw中的静态文件,但是不能写。

注意2:[MODE_WORLD_READABLE](https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE), and [MODE_WORLD_WRITEABLE](https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE) 已经废弃了,但是如果想分享私有文件给其他应用,可以用``FileProvider``借助``URI``将``file``暴露出去。

保存缓存文件

可以使用``getCacheDir()``来打开一个``File``,这个``file``代表``应用临时保存缓存文件的``internal directory``。

当设备``internal directory``空间减少时``,``Android``将会删除这些缓存文件以回复空间。但是,不应该依赖系统为你清理文件``,你应该自己维护缓存文件,将其保持在一个合理的空间大小``。

当用户卸载应用时``,缓存文件也将被移除。

cache abs path: /data/user/0/<pkgName>/cache

externalStorageDir abs path: /storage/emulated/0

file dir path: /data/user/0/``<pkgName>``/files

data dir path: /data/user/0/``<pkgName>``/files

externalCacheDir path: /storage/emulated/0/Android/data/<pkgName>/cache

externalMediaDir path: /storage/emulated/0/Android/media/<pkgName>

二,使用``External Storage

包括``可移动的存储媒介(如``SD``卡)和不可移动的存储器``。保存在``ES``的文件都是全局可读的,可以被用户修改``。

注意``:如果用户挂载``ES``在电脑上或者移出媒介, ES``可能变得不可用``。

使用限定的``目录访问``,例如访问``Pictures``目录``。``Android 7.0``及以后``,系统提供一个简化的权限``UI``告诉用户``APP``正在请求权限。

image.png

检查媒介是否可用

在使用``ES``之前``,你应调用``getExternalStorageState()``来检查是否媒介可用``,因为媒介可能挂载在电脑上,可能不存在``,可能只读``,或其他。

<pre class="western" style="background: #272822">/ Checks if external storage is available for read and write /
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/ Checks if external storage is available to at least read /
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}</pre>

  1. 保存可被其他``apps``共享的文件

你可以使用共享的公共目录``,比如``Music/, Picture/, Ringtones/``等。

<pre class="western">}
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {

}
return file;
}</pre>

  1. 保存``app-private``的文件

如果你不是为了和其他``APP``共享文件,你应该使用一个私有的``存储目录``在``ES``上,调用``getExternalFileDir(``String directoryType``)``。

注意:当用户卸载应用的时候``,这个目录和它的内容都会被删除``。而且``,系统媒体扫描器也读不到它们``,因此它们不可被``MediaStore``访问到``。

注意``:尽管``getExternalFileDir()``和``getExternalFilesDirs()``不能被``MediaStore``内容提供者访问到,但是其他的``APP``带有``READ——EXTERNAL——STORAGE``权限的可以访问所有的``ES``上的文件,包括这些。如果你需要完全限制访问你的文件``,你应该写文件在``internal storage``里面。

  1. 保存``缓存文件

为了打开一个代表``ES``的缓存文件,你可以调用``getExternalCacheDir()``,如果用户卸载了应用``,这些文件将被自动删除。

注意``:为了保持文件空间和维护``APP``性能,小心地管理缓存文件和``remove``应用生命周期不再需要的缓存文件是很重要的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,071评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,327评论 0 17
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,360评论 2 44
  • 没忙翻译稿件的时候,就会上QQ空间遛达。某日,看到一个译友发了条说说: 同门才俊佳灿说,他把某本好书藏在图书馆...
    写译人生阅读 425评论 7 0
  • 看到一些令自己嗤之以鼻的事情,刚想发怒吐槽,瞬间一想与其这样,那么我自己的世界到哪里去了呢? 是不是我看到这些东西...
    烟渺城阅读 158评论 0 1