这篇文章是我自己对Training->Get Started->Saving Data->Saving Files的翻译。

保存文件(Saving Files)

Android使用一个文件系统,类似于在其他平台上基于磁盘的文件系统。本课介绍如何使用Android提供的File API接口对文件系统中的文件进行读写操作。

一个File对象是适合于读写一连串从头到尾没有跳跃的数据。例如,图像文件或者通过网络交换的文件。

本课介绍如何在你的应用程序执行与文件相关的基本任务。本课假设你已经熟悉了Linux文件系统的基础知识和java.io中的标准文件输入/输出接口。

选择内部或外部存储(Choose Internal or External Storage)

所有的Android设备都有两个文件存储区:“内部”和“外部”的存储。这个名称来自于早期的Android,当时大多数设备都提供内置的非易失性存储器(内存),加上一个可移动存储介质如微型SD卡(外部存储)。一些设备将永久存储空间划分为“内部”和“外部”两个分区,所以即使没有移动存储介质,总是存在着两个存储空间,并且无论外部存储是否可移动,API的行为都是相同的。每个存储空间的特性如下所示:

内部存储(Internal storage)

  • 它总是可用。
  • 应用程序默认保存文件在这里。
  • 当用户卸载你的应用程序时,系统会从内部存储中删除这个应用程序的全部文件。

当你确定无论是用户还是其它应用程序都不会访问你的文件时,使用内部存储就是合适的。

外部存储(External storage)

  • 它并非总是可用的。因为用户可以像USB存储一样装载外部存储,在某些情况下也会把它从设备中移除。
  • 它是广泛可读的,所以文件保存在这里,可以在不受你控制的情况被读取。
  • 当用户卸载你的应用程序时,只有在使用getExternalFilesDir()获取的目录中存放的文件,才会被系统删除。

外部存储适合于存放那些不需要访问限制的文件,或者是你想与其他应用程序分享的文件,又或者是允许用户通过计算机访问的文件。

提示:虽然应用程序被默认安装到内部存储器,你可以通过在manifest文件中指定android:installLocation属性把应用程序安装到外部存储。用户欣赏此选项,当apk文件非常大时,他们有一个外部的存储空间,大于内部存储。更多信息,查看应用程序的安装位置(App Install Location)。

获取外部存储权限(Obtain Permissions for External Storage

为了可以写入外部存储,你必须在manifest文件中请求WRITE_EXTERNAL_STORAGE权限。

<manifest ...>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    ...</manifest>
注意:目前,所有的应用程序都有读取外部存储的能力,而不需要特别的权限。然而,这将在未来的版本中发生改变。如果你的应用需要读取外部存储(但不是写入它),那么你需要声明READ_EXTERNAL_STORAGE权限。为了确保你的应用程序可以继续正常工作,你应该在变更生效前就声明此权限。

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

不管怎样,只要你的应用程序使用WRITE_EXTERNAL_STORAGE获得了权限,那么它就已经具备读取外部存储的权限了。

将文件保存到内部存储不需要任何权限。你的应用程序总是可以读写内部存储中的文件。

在内部存储中保存一个文件(Save a File on Internal Storage)

当需要将文件保存到内部存储时,你可以通过一个File对象来调用以下两种方法之一来获取适当的目录:

getFilesDir()

返回一个File,代表着一个供应用使用的内部存储上的目录。

getCacheDir()

返回一个File,代表着一个供应用程序临时缓存文件使用的内部存储上的目录。每个文件一旦不再需要,务必将它们删除。每个文件需要实现合理的大小,如1MB。如果系统在存储上运行较慢,它可能会删除你的缓存文件而不给予任何警告。

要在一个目录中创建一个新的文件,你可以使用File()构造函数,传递一个指定了内部存储目录的File(通过上面两种方法获得的)。比如说:

File file = new File(context.getFilesDir(), filename);

或者,你可以调用openFileOutput()来获得一个FileOutputStream,用于往内部存储目录中写文件。举例来说,下面的代码显示了如何把一些文本信息写入到一个文件里:

String filename = "myfile";String string = "Hello world!";FileOutputStream outputStream;try {  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);  outputStream.write(string.getBytes());  outputStream.close();} catch (Exception e) {  e.printStackTrace();}

或者,如果你需要缓存一些文件,那么你应该使用createTempFile()做为代替。例如,下面的方法从一个URL中提取文件名,并在应用程序的缓存目录中创建一个具有该名称的文件:

public File getTempFile(Context context, String url) {    File file;    try {        String fileName = Uri.parse(url).getLastPathSegment();        file = File.createTempFile(fileName, null, context.getCacheDir());    catch (IOException e) {        // Error while creating file    }    return file;}

注意:你的应用程序所使用的内部存储目录,是Android文件系统中一个以应用程序的包名称指定的特殊位置。从技术上讲,如果你将内部文件的属性设置为可读的,那么另一个应用程序就可以读取你的内部文件。然而,其他应用程序也需要知道你的应用程序的包名称和文件名。其他应用程序无法浏览你的内部目录也没有读写权限,除非你显式地设置文件是可读或可写的。只要你对内部存储上的文件使用MODE_PRIVATE,那么它们对于其他应用程序来说就是不可访问的。

在外部存储上保存一个文件(Save a File on External Storage)

因为外部存储可能不可用,例如当用户已安装的存储到电脑或已删除SD卡,提供外部存储你应该确认体积在访问它是可用的。你可以通过调用getexternalstoragestate()查询外部存储状态。如果返回的状态是等于media_mounted,然后你可以读写你的文件。例如,下面的方法来确定有效存储有用:

/* 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;}

更多相关文章

  1. android--系统jar包引用
  2. android : 修改frameworks/base/ 代码需要注意的地方
  3. android编写Service入门用法与教程
  4. Android:sharedUserId介绍
  5. 绕过身份检测,破解Android(安卓)SU
  6. MyEclipse安装Android(安卓)ADT 方法,亲测,能用
  7. [原]Android系统进程Zygote启动过程的源代码分析
  8. Android(安卓)监控程序安装和删除的实现
  9. Android导入一个工程时提示 Invalid project description的解决

随机推荐

  1. 动态下发 so 库在 Android APK 安装包瘦
  2. Android视频图片缩略图的获取
  3. BitRaser for Mobile iOS和Android移动设
  4. 重置Android中的帧动画播放
  5. Android 使用AsyncTask后台线程实现数据
  6. android中关于handler
  7. Android(安卓)中的ANR 问题,响应灵敏性
  8. Android智能硬件开发心得总结(一)
  9. Linux 环境下Android(安卓)Tcpdump 抓取
  10. Android 版 Instagram 正式推出!