Android Saving Files 简介 + 实例源码

首先我们要知道Android  内部存储 (Internel Storage)和 外部存储(External Storage) 的存储的分类。

Internel Storage :  通常就是手机自带的内存(Flash),这个存储空间,总是可用的,文件默认保存到

这里,卸载应用程序时,与程序相关的文件将一并被自动删除。


Externel Storage :  通常就是 SD 内存卡,可知他并不是总是可用的,它可能被卸载(unmount)。它总

是可读的(world-readable),应用程序被卸载时,系统自动删除通过  getExternalFilesDir()

得到的目录下的文件。

 

Internel 有读写限制,而Externel没有,但是在将来会被实现限制功能。

 

1.当使用 SD 卡时,要 加上 写(write) Permissions 

<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>
对于 读(Read) 权限,现在,所有的应用 有能力读而不需 Permissions

但是这个 Read 权限功能,将会在未来某个发布版本中添加,为了你的应用的可持续,所以有必要添加

Read 权限

<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ...
</manifest>
2.Internel Storage 文件操作 

应用的存储路径被你应用的包名(package name)指定,

在Android 文件系统的特殊位置:

创建的文件存放在/data/data/<package name>/files目录下。

我们用 Context.getCacheDir() 或 Context.getFilesDir() 来获取。

其中 Context.getCacheDir()是得到的 cache 目录。

①创建文件 

File file = new File(context.getFilesDir(), filename);
②写文件 用 FileOutputStream 流对象操作 

String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;

try {
  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
  outputStream.write(string.getBytes());
  outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

PS: filename 不能包含路径,只是单纯的文件名。   

 FileOutputStream openFileOutput (String name, int mode)

可能抛出(throw) FileNotFoundExecption。

name                        The name of the file to open; can not contain path separators.
mode Operating mode. Use 0 or MODE_PRIVATE for the default operation, MODE_APPEND to append to an existing file, MODE_WORLD_READABLE and MODE_WORLD_WRITEABLE to control permissions.

③保存文件 Save a File

④删除文件 调用 ContextdeleteFile(): 方法。

myContext.deleteFile(fileName);

3.External Storage 文件操作

① 对于 SD 内存卡,我们操作之前要先检验一下是否挂载。

用 String Environment.getExternalStorageState() 得到状态。

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

②External 文件分为 Public files 和 Private files 两种。

对于 External 目录的获取,

Public files 用

public static File getExternalStoragePublicDirectory (String type)

Ad
Private files 用

getExternalFilesDir() 或者 Context.getExternalFilesDir()

    File file = new File(context.getExternalFilesDir(
            Environment.DIRECTORY_PICTURES), albumName);
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
当然目录可能不存在

    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");

④调用文件对象的 delete() 方法。

myFile.delete();

最后

当你卸载应用程序时,系统将自动删除以下文件::

  • 此程序存储在 Internal Storage 里的所有文件
  • 此程序使用 getExternalFilesDir()保存在. external storage 里的文件。
  • 但是, 但是你需要手动删除 用getCacheDir() 创建的 cached files 和不再需要的其他文件。.


实例:Files_RW_SourceCode.zip




posted @ 2012-11-22 17:14  热血小伙  阅读(185)  评论(0编辑  收藏  举报