使用内部存储器
你可以把文件直接保存在设备的内部存储器上。默认情况,保存在内部存储器上的文件是你的应用程序私有的,并且其他的应用程序(或其他的用户)不能访问它们。当用户卸载你的应用程序时,这些文件也会被删除。
以下是在内部存储器上创建和写入私有文件的方法:
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这样的应用程序也不能读取。