我的翻译:Saving Files

这篇文章是我自己对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;
}

 

转载于:https://my.oschina.net/allenyao/blog/104026

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值