您的位置:首页 > 移动开发 > Android开发

Android的数据存储---可供选择的存储方案(二)

2013-01-07 19:33 239 查看
使用内部存储器

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

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

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();

MODE_PRIVATE会创建一个文件(或替换相同名称的文件),并让它成为你的应用程序私有文件。其他有效的模式包括:MODE_APPEND,MODE_WORLD_READABLEMODE_WORLD_WRITEABLE

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

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

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

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

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

保存缓存文件

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

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

其他有用的方法

getFileDir()

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

getDir()

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

deleteFile()

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

fileList()

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

使用外部存储器

每个兼容的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_MUSICDIRRECTORY_RINGTONES(传递null,会接收到你的应用程序的文件所在的根目录)。如果需要这个方法会创建对应的目录。通过指定的目录类型,你可以确保Android系统的媒体扫描器会把你的文件正确的在系统中分类(如,ringtones是作为铃声来定义的,而不是音乐)。如果用卸载了你的应用程序,这些目录和它所有的内容都会被删除。

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

/Android/data/<package_name>/files/

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

保存要被共享的文件

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

在API Level 8以后,通过把诸如DIRECTORY_MUSICDIRECTORY_PICTURESDIRECTORY_RINGTONE或其他的目录类型传递给getExternalStoragePublicDirectory()方法,来获取你想要的公共目录,如过需要,这个方法还会创建对应的目录。

如果你使用的是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/<package-name>/cache/

<package-name>是你的Java样式的包名,如“com.example.android.app”

技巧提示:

在你的外部文件目录中包含一个命名为.nomedia的空文件(注意文件名中没有前缀)。这样就会阻止Android媒体扫描器从其中读取你的媒体文件,包括像Gallery或Music这样的应用程序也不能读取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: