Android数据存储之文件存储

来源:互联网 发布:淘宝视频编辑软件 编辑:程序博客网 时间:2024/04/29 16:14

目录结构

l  概述

l  内部存储

l  外部存储

l  总结

 

1概述

Android的文件存储区别于sharedPreferences方式的键值对,也区别于关系型数据库的SQLite存储。对于文件数据类型如文本、音频、视频等的存储上述两种方式不可行。Android提供了对文件存储的支持。根据文件的访问权限,可以将私有的不被其他应用程序访问的文件作为内部存储,当应用被卸载时,文件也被销毁;希望被其他应用程序共享的音频、视频等文件可以作为外部存储存储在SD卡上,当应用被卸载时,文件依旧被保留下来,供其他应用程序访问。

2 内部存储

2.1写操作:

ü  调用openFileOutput(),传入文件名和操作模式这两个参数,返回输出流FileOutputStream.

ü  Write()写入文件

ü  Close()关闭输出流

 

小实例:

String FILENAME = “myFile.txt”;

String string ="hello world!";

 

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

fos.write(string.getBytes(“UTF-8”));

fos.close();

 

在Activity中运行,在Eclipse的File Explorer窗口中即可看到刚新建的文件,如图:

图片中可以清晰的看出新建文件在内部存储中的目录结构。

 

MODE_PRIVATE表明创建文件的权限是私有的,其他的模式有:MODE_APPEND,MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE

 

 

2.2读操作:

 

ü  调用openFileInput(),传入文件名参数,返回一个输入流FileInputStream

ü  Read()读取字节

ü  Close()关闭输入流

 

如果你需要在应用启动中调用静态文件,可以将静态文件保存在如下工程路径下:res/raw/

在读取时调用方法openRawResource(),传入R.raw.<filename>资源ID,返回一个输入流InputStream

 

2.3 保存缓存文件

对于有些缓存文件的存储,使用getCacheDir()打开一个File文件保存。当设备的内部可用空间过低时,android系统将会删除一些缓存文件以释放出空间来。当然,你不能总指望系统给你清理这些缓存,我们应该限制缓存文件的大小,例如1MB的上限,以让应用能够稳定的运行。当用户卸载应用程序时,这些缓存文件也跟着被删掉。

 

2.4 其他一些有用的方法

 

GetFilesDir()

获得通过内部存储方式存储的文件的绝对路径。如上面的小例子返回的绝对路径是:

/data/data/com.aaron.learn/files

getDir()

   在当前内部存储中新建(如果存在则打开)指定名字的文件夹

deleteFile()

   删除内部存储上的指定文件

fileList()

返回当前应用程序保存的所有文件列表

 

 

值得注意的是,当我们调用getDir("myFolder", Context.MODE_PRIVATE);新建的文件夹名并不是指定的”myFolder”,而是系统默认在其前面加上了前缀:app_,如图所示:

3 外部存储

3.1 检查外部存储介质是否可用

在需要使用外部存储时,如SD卡,首先得检查存储介质是否可用。通过调用getExternalStorageState()返回String类型的状态码来确定是否可用,是否只读等。下面的代码片段就是检测存储介质的小实例:

 

booleanmExternalStorageAvailable = false;

boolean mExternalStorageWriteable = false;

String state = Environment.getExternalStorageState();

 

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

    // We canread and write the media

   mExternalStorageAvailable = mExternalStorageWriteable = true;

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

    // We canonly 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;

}

 

 

3.2 访问外部存储文件

API8或更高版本中提供方法getExternalFilesDir()打开外部存储路径。其他版本的API中,使用getExternalStorageDirectory()方法。

 

3.3 保存共享文件

如果不希望某些文件在应用程序卸载时被删掉,可以在外部存储介质中开辟一个公共的文件目录来存储,比如:Music/,Picture/,RingTone/等。

AIP8 或更高版本中,使用getExternalStoragePublicDirectory(),传入文件类型参数,如DIRECTORY_MUSIC,DIRECTORY_PICTURES,DIRECTORY_RINGTONES等等:

Ø  DIRECTORY_ALARMS – 警告铃音

Ø  DIRECTORY_DCIM – 摄像头拍下的照片或者视频

Ø  DIRECTORY_DOWNLOADS – 用户下载的文件

Ø  DIRECTORY_MOVIES – 电影

Ø  DIRECTORY_MUSIC – 音乐

Ø  DIRECTORY_NOTIFICATIONS – 提示铃音

Ø  DIRECTORY_PICTURES – 图片

Ø  DIRECTORY_PODCASTS – 数字广播

Ø  DIRECTORY_RINGTONES – 来电铃声

 

3.4 缓存文件

使用getExternalCacheDir()打开外部存储路径。

4 总结

1.        Android提供的文件存储API基本上是Java平台的IO操作,因此,对于java开发人员很容易理解和掌握。

2.        Android文件系统权限。观察一下FileExplorer窗口,在Permissions列,有些形如drw--w---x的字符串。

由于Android是基于Linux开发的,因此Android系统文件权限实际就是Linux权限。在Linux中,一个文件的权限有3个组别:用户、群组、其他。其中每个组包含三种权限:读(r)、写(w)、执行(x)。这样来说,每个文件就有9个权限属性。其中d表示这是一个目录。

例如:-rw--w---x中,用户对其享有读和写的权限、群组对其享有写的权限,其他享有执行的权限。

 

 

原创粉丝点击