美文网首页
2018-01-13

2018-01-13

作者: 天青色等煙雨_而我在等妳 | 来源:发表于2018-01-13 20:16 被阅读19次

<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``应用生命周期不再需要的缓存文件是很重要的。

相关文章

网友评论

      本文标题:2018-01-13

      本文链接:https://www.haomeiwen.com/subject/fshhoxtx.html