前言:

一般使用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为操作模式,有以下保存模式:

  1. Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下写入的内容会覆盖原文件的内容。
  2. Context.MODE_APPEND:检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
  3. Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
  4. 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:已经卸载。