基于Android网络数据存储方案的选择,Android的数据存储---可供选择的存储方案(二)...

使用内部存储器

你可以把文件直接保存在设备的内部存储器上。默认情况,保存在内部存储器上的文件是你的应用程序私有的,并且其他的应用程序(或其他的用户)不能访问它们。当用户卸载你的应用程序时,这些文件也会被删除。

以下是在内部存储器上创建和写入私有文件的方法:

1. 调用带有文件名称和操作模式参数的openFileOutput()方法,该方法会返回一个FileOutputStream对象。

2. 用write()方法写入文件。

3. 用close()方法关闭该文件流。

例如:

String FILENAME = "hello_file";

String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);

fos.write(string.getBytes());

fos.close();

以下是从内部存储器中读取文件的方法:

1.调用带有文件名参数的openFileInput()方法来读取文件。这个方法会返回一个FileInputStream对象。

2.用read()方法从文件中读取字节;

3.用close()方法关闭该文件流。

提示:如果你想要在编译时在应用程序中保存一个静态文件,要把该文件保存到你的工程中的res/raw/目录中。你可以用openRawResource()来打开它,这个方法需要R.raw.的资源ID作为参数。这个方法会给你返回一个可以读取文件的InputStream对象(但你不可以对原始文件执行写入操作)。

保存缓存文件

如果你想要缓存一些数据,而不是持久化的保存,你应该使用getCacheDir()方法来打开一个代表内部目录的File对象,你的应用程序会使用这个File对象来保存临时的缓存文件。

当设备内部存储空间不足时,Android可以删除这些缓存文件来恢复空间。但是,你不应该依赖系统来给你清理这些文件。你应该始终由自己来维护这些缓存文件,让它所消耗的空间保持在合理的限度,如1MB。当用户卸载你的应用程序,这些文件会被删除。

其他有用的方法

获取保存内部文件的绝对路径。

在你的内部存储器中创建一个(或打开一个既存的)目录。

删除保存在内部存储器上的一个文件。

返回你的应用程序当前保存的文件数组。

使用外部存储器

每个兼容的Android设备都支持一个可以保存文件的外部存储器。这种存储器可以是可插拔的存储介质(如SD卡),也可以是内部(不可插拔的)的存储器。当用户使用USB把文件传输到计算机上时,这些保存在外部存储器上文件是完全可读并可编辑的。

给外部存储器提供的SD卡插槽,也可以做为设备的内部存储器的一部分来使用。在这种情况下,该SD卡不是外部存储器,并且你的应用程序不能访问它(这种额外的存储器只用于为用户提供系统所扫描到的存储介质)。

警告:如果用户把外部存储器挂载到计算机上或移除了该存储介质,并且没对保存在其中的文件执行安全措施,那么该外部存储器就变成无效存储器。任何应用程序都可以读写保存在外部存储器上的文件,并且用户可以删除它们。

检查存储介质的有效性

在使用外部存储器做任何工作之前,你应该始终调用getExternalStorageState()方法来检查该介质是否有效。该存储器可能是被挂载到计算机上、丢失、只读、或者是其他状态。例如,以下代码用于检查外部存储介质的有效性:

boolean mExternalStorageAvailable = false;

boolean mExternalStorageWriteable = false;

String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {

// We can read and write the media

mExternalStorageAvailable = mExternalStorageWriteable = true;

} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {

// We can only read the media

mExternalStorageAvailable = true;

mExternalStorageWriteable = false;

} else {

// Something else is wrong. It may be one of many other states, but all we need

//  to know is we can neither read nor write

mExternalStorageAvailable = mExternalStorageWriteable = false;

}

这个例子检查了外部存储器是否可用于读写。getExternalStorageState()方法返回了你要检查的其他状态,如该存储介质是否处于共享状态(跟计算机相连)、是否是完全的丢失了(已经被恶意的删除)等等。当你的应用程序需要访问这些存储介质时,你可以使用这些状态信息来通知用户。

访问外部存储器上的文件

如果你使用的是API Level 8以后的版本,就可以使用getExternalFilesDir()方法来打开一个代表保存你的文件所在的外部存储器目录的File对象。这个方法需要指定一个你想要的子目录的类型,如DIRRECTORY_MUSIC和DIRRECTORY_RINGTONES(传递null,会接收到你的应用程序的文件所在的根目录)。如果需要这个方法会创建对应的目录。通过指定的目录类型,你可以确保Android系统的媒体扫描器会把你的文件正确的在系统中分类(如,ringtones是作为铃声来定义的,而不是音乐)。如果用卸载了你的应用程序,这些目录和它所有的内容都会被删除。

如果你使用的是API Level 7以前的版本,就要使用getExternalStorageDirectory()方法来打开代表外部存储器根目录的File对象,然后应该把数据写入以下目录:

/Android/data//files/

是Java样式的包名,如“com.example.android.app”。如果用户设备运行的是API Level 8以后的版本,并且它们卸载了你的应用程序,这个目录和其中所有的内容都会被删除。

保存要被共享的文件

如果你不想要把文件保存成你的应用程序所专有的文件,并且在应用程序被卸载时,这些文件也不被删除,那么就应该把这些文件保存到外部存储器上的一个公共目录中,这些公共目录位于外部存储器的根,如Music/,Pictures/,Ringtones/等。

如果你使用的是API Level 7或以前的版本,就要使用getExternalStorageDirectory()方法来打开一个代表外部存储器根目录的File对象,然后把你的共享文件保存到下列之一的目录中:

Music/---媒体扫描器把在这个目录中找到的所有多媒体文件都作为音乐

Podcasts/---媒体扫描器把在这个目录中找到的所有多媒体文件都作为博客

Ringtones/---媒体扫描器把在这个目录中找到的所有多媒体文件都作为铃声

Alarms/---媒体扫描器把在这个目录中找到的所有多媒体文件都作为闹铃

Notifications/---媒体扫描器把在这个目录中找到的所有多媒体文件都作为通知音

Pictures/---所有的照片(不包括用相机拍摄的)

Movies/---所有的电影(不包括用摄像机拍摄的)

Download/---其他下载内容

保存缓存文件

如果你使用的是API Level 8或以后的版本,就可以使用getExternalCacheDir()方法来打开一个File对象,它代表了存放你的缓存文件的外部存储器目录。如果用户卸载了你的应用程序,这些文件会被自动的删除。但是,在应用程序活动期间,你应该管理这些缓存文件,并在不需要的时候删除它们,以便保留文件空间。

如果你使用的API Level 7或以前的版本,就要使用getExternalStorageDirectory()方法来打开一个File对象,它代表了外部存储器的根目录,然后把缓存数据写入下列目录:

/Android/data//cache/

是你的Java样式的包名,如“com.example.android.app”

技巧提示:

在你的外部文件目录中包含一个命名为.nomedia的空文件(注意文件名中没有前缀)。这样就会阻止Android媒体扫描器从其中读取你的媒体文件,包括像Gallery或Music这样的应用程序也不能读取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值