前言:
一般使用SharedPreferences方式存储的内容是一些键值对(key-value),使用SQLite数据库来操作存储数据表,而有时候我们却要存储的是一些文件,这时候我们可以采用文件存储的方式。
Java提供了一套完整的IO流体系,用来对文件进行操作。Android同样支持以这种方式来访问手机存储器上的文件,包括内部存储器和外部存储器(即SD卡)
文件存储的特点:
优点:可以处理大量数据
缺点:当文件更新或者格式改变会造成大量的编程工作
文件存储可以分成两类 :
1、将文件存储在应用程序内,在Android系统中,这些文件保存在**/data/data//files/目录下,称为File存储,默认情况下,文件是不能在不同应用程序间共享的,当该应用程序卸载时,这些文件将被删掉;
2、将文件存储在外接的存储设备中,也就是存储在SDCard**存储卡中,称为SDCard存储。
Android中读取/写入文件的方法:
Android中读取/写入文件的方法与Java中的I/O是一样的。
利用Context或者Activity中的openFileInput()方法与FileInputStream对象来读取设备上的文件;
利用Context或者Activity中的openFileOutput()方法与FileOutputStream对象来创建设备上的文件;
context是个抽象类,而Activity、Service、Application都是其子
FileOutputStream openFileOutput(String name, int mode)
保存文件内容,打开指定的私有文件输出流,参数 name为要打开的文件名,不能包含路径分隔符,参数mode为操作模式,有以下保存模式:
- Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下写入的内容会覆盖原文件的内容。
- Context.MODE_APPEND:检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
- Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
- Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
在使用模式时,可以用"+"来选择多种模式,比如:
openFileOutput(“jay123.txt”, Context.MODE_PRIVATE+Context.MODE_WORLD_READABLE)。
FileInputStream openFileInput(String name)
读取文件内容,打开指定的私有文件输出流,name为要打开的文件名,不能包含路径分隔符。
boolean deleteFile(String name)
删除指定的文件,name为要删除的文件名,不能包含路径分隔符。
File getDir(String name, int mode)
在应用程序的数据文件下获取或创建name对应的子目录。
File getFilesDir()
得到该应用程序数据文件夹的绝对路径。
String[] fileList()
得到该应用程序数据文件夹下的全部文件的文件名。
SDCard存储
前言:
如果想存储的是视频、音乐等需要占用大量存储空间的文件,那么存储到手机内存中显得很不明智,所以我们会将这些大文件数据存储到SD卡中。
SD卡读写步骤
1、在AndroidManifest.xml中添加SD权限,即:创建删除文件权限和写入数据权限。
<!-- 在SDCard中创建与删除文件权限 --
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 --
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、读写前先判断SD卡是否插入,并且可以读写
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
3、获取SD卡的外部目录,同时获取SD卡的路径
Environment.getExternalStorageDirectory().getCanonicalPath()+"/"+fileName
4、使用FileOutputStream,FileInputStream或者FileReader或FileWriter读写SD卡中的文件
Android应用开发中,常使用Environment类去获取外部存储目录,在访问外部存储之前一定要先判断外部存储是否已经是可使用(已挂载&可使用)状态。
以下方法都是static的,可以直接用Environment类名调用。
static File getDataDirectory()
获得Android下的data文件夹的目录。
static File getDownloadCacheDirectory()
获得AndroidDownload/Cache内容的目录。
static File getExternalStorageDirectory()
获得Android外部存储器也就是SDCard的目录。
static File getRootDirectory()
获得Android下的root文件夹的目录。
getAbsolutePath()
表示获取当前文件的绝对路径+相对路径
如果构造的时候是全路径就直接返回全路
如果构造时是相对路径,就返回当前目录的路径 + 构造 File 对象时的路径
getCanonicalPath():表示获取当前文件的绝对路径,会把 ..\ 、.\ 这样的符号解析掉
例如:D:\workspace\Test\TestWeb\src\..\a.txt
D:\workspace\Test\TestWeb\a.txt
static String getExternalStorageState()
获得Android外部存储器的当前状态,有以下保存模式:
Environment.MEDIA_BAD_REMOVAL:在没有正确卸载SDCard之前就移除了。
Environment.MEDIA_CHECKING:正在磁盘检查。
Environment.MEDIA_MOUNTED:已经挂载并且拥有可读可写权限。
Environment.MEDIA_MOUNTED_READ_ONLY:已经挂载, 但只拥有可读权限。
Environment.MEDIA_NOFS:对象空白, 或者文件系统不支持。
Environment.MEDIA_REMOVED:已经移除扩展设备。
Environment.MEDIA_SHARED:如果SDCard未挂载, 同时通过USB大容量存储方式与其他设备共享。
Environment.MEDIA_UNMOUNTABLE:不可以挂载任何扩展设备。
Environment.MEDIA_UNMOUNTED:已经卸载。