Android数据存储之File-阿里云开发者社区

开发者社区> 文艺小青年> 正文

Android数据存储之File

简介:
+关注继续查看

Android使用与其他平台类似的基于磁盘文件系统(disk-based file systems),上篇文章通过SharedPerference来进行数据存储,这次可以使用File。File 对象非常适合用来读写那种流式顺序的数据,可以用来读写图片文件或者是网络中交换的数据。

存储位置

所有的Android设备都有两个文件存储区域:"internal" 与 "external" 存储。 那两个名称来自与早先的Android系统中,那个时候大多数的设备都内置了不可变的内存(internal storage),然后再加上一个类似SD card(external storage)这样可以卸载的存储部件。后来有一些设备把"internal" 与 "external" 的部分都做成不可卸载的内置存储了,虽然如此,但是这一整块还是从逻辑上有被划分。

Internal storage:总是可用的;这里的文件默认是只能被自己的app所访问的;当用户卸载app的时候,系统会把internal里面的相关文件都清除干净;Internal是在你想确保不被用户与其他app所访问的最佳存储区域。

External storage:并不总是可用的,因为用户可以选择把这部分作为USB存储模式,这样就不可以访问了;是大家都可以访问的,因此保存到这里的文件是失去访问控制权限的;当用户卸载你的app时,系统仅仅会删除external根目录(getExternalFilesDir)下的相关文件;External是在你不需要严格的访问权限并且你希望这些文件能够被其他app所共享或者是允许用户通过电脑访问时的最佳存储区域。

Internal storage保存

保存到手机的internal的时候,需要两种方法去取出文件目录:

getFilesDir() : 返回一个File,代表app的internal目录。

getCacheDir() : 返回一个File,代表了app的internal缓存目录。需要确保这个目录下的文件在一旦不再需要的时候能够马上被删除,还要分配一个合理的大小,例如1MB 。如果系统的内部存储空间不够,会自行选择删除缓存文件。

下面这种方式直接通过openFileOutput,在对应的路径下创建一个文件:

1
2
3
4
5
6
7
8
9
10
11
String filename ="testfile";
    String string = "FlyElephant!";
    FileOutputStream outputStream;
    
    try {
    outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
    outputStream.write(string.getBytes());
    outputStream.close();
    catch (Exception e) {
    e.printStackTrace();
    }

  当然如果你想保存一些缓存文件的时候,就需要调用一下系统的getCacheDir()方法:

1
2
3
4
5
6
7
8
9
File file;
    try {
    String fileName="CacheTest";
    file = File.createTempFile(fileName, ".txt",
    MainActivity.this.getCacheDir());
    }
    catch (IOException e) {
    // Error while creating file
    }

External storage保存

刚才保存到Internal中的时候什么都没有配置,需要保存到外部的时候需要配置读写的权限,读的权限READ_EXTERNAL_STORAGE,写的权限:READ_EXTERNAL_STORAGE:

1
2
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

  先来看一段保存到外部存储的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (Environment.getExternalStorageState().equals(
        Environment.MEDIA_MOUNTED)) {
    File file = new File(Environment.getExternalStorageDirectory(),
            "66.txt");
    try {
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject("FlyElephant");// 写入
        fos.close(); // 关闭输出流
    catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Log.i("com.example.googlefile", file.getAbsolutePath());

首先需要判断一下SD卡是不是可用,因为external storage可能是不可用的比如SD卡被拔出,那么你应该在访问之前去检查是否可用。你可以通过执行 getExternalStorageState()来查询external storage的状态。如果返回的状态是MEDIA_MOUNTED, 那么你可以读写。(开始没有判断的时候,一直没有找到报错的原因)

看到这个获取完之后跟上面保存在内部存储设备的过程一样,下面就不用多说什么了,最后一点就是路径是在/mnt/sdcard目录下,如果是弄成私有文件,不允许外部访问,目录应该是在

/mnt/sdcard/Android/data/包名 目录下。

文件存储比较简单,另外说下文件删除吧,保存到外部:

1
file.Delete()

Internal中的删除:

1
MainActivity.this.deleteFile("testfile")
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4047340.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package ……; import android.
704 0
android 向SD卡写入数据
原文: android 向SD卡写入数据 1.代码: /** * 向sdcard中写入文件 * @param filename 文件名 * @param content 文件内容 */ public ...
687 0
Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package ……; import android.
497 0
Android 6.0 fork Zygote时的存储权限管理
Android 6.0开始支持运行时权限管理的功能。运行时权限管量中当然也包括对READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE这两个权限的动态管理。系统需要提供在不杀掉或重启已经运行的应用的情况下去动态授权的机制。 这篇文章就是讲在Zygote fork的
7659 0
Druid数据规划
## 数据规划 Druid索引好的数据放在Historical中,随着数据规模的扩大,分离数据的需求逐渐变得迫切。Druid提供了Tier机制与数据加载Rule机制,通过它们能很好的将数据进行分离,从而达到灵活的分布数据的目的。 #### Tier机制 Tier机制的作用是将Historical节点进行分组。默认情况下所有的Historical节点属于语默认的“_default_
5952 0
Android OkHttp与物理存储介质缓存:DiskLruCache(2)
 Android OkHttp与物理存储介质缓存:DiskLruCache(2) 本文在附录文章8,9的基础之上,把Android OkHttp与DiskLruCache相结合,综合此两项技术,实现基于OkHttp的物理存储介质缓存DiskLruCache。
823 0
[20121227]v$datafile访问是从数据文件获取信息吗.txt
[20121227]v$datafile访问是从数据文件获取信息吗.txt记得以前开始学习oracle的时候,被问及访问v$datafile从哪里获取信息,当时想都没想,从数据文件.
652 0
Android二级缓存之物理存储介质上的缓存DiskLruCache
 Android二级缓存之物理存储介质上的缓存DiskLruCache Android DiskLruCache属于物理性质的缓存,相较于LruCache缓存,则DiskLruCache属于Android二级缓存中的最后一级。
705 0
3576
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载