最近一段时间,工作和学习方面都比较忙,所以,博客方面有一段时间没有投入时间啦,今天学习了一下android文件存储方面的知识,主要是Internal StorageExternal Storage的相关特性.主要知识来自android的官方文档和其他人的博客.

Internal Storage

 一般来说,你可以直接存储文件在机器的internal storage中,存储在这个位置的文件是私有的,其他应用无法获得.但是当用户卸载你的应用时,文件就被删除啦.

通过openFileOutput()传入文件的名字和操作模式,就可以获得FileOutputStream,然后就可以write(),然后close啦.

String FILENAME = "hello_file";String string = "hello world!";FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);fos.write(string.getBytes());fos.close();

MODE_PRIVATE模式会创建或者替换同名文件,并让文件变为私有的,其他的一些模式还有MODE_APPEND(追加模式),MODE_WORLD_READABLE(全局可读)和MODE_WORLD_WRITEABLE(全局可写).
通过OpenFileInput()函数可以进行文件的读取.

 Android的内部存储路径为/data/data/packagename/,加入你的应用名为com.example.test,那么这个路径就为/data/data/com.example.test,这个路径下一般会有files,cache和你自己生成的文件夹.那么如下的操作返回的路径如下

  • Context.getFileDir(),获得/data/data/com.example.test/files这个文件夹的File对象
  • Context.openFileInput()和Context.openFileOutput,读取的是files文件夹下的文件
  • Context.fileList(),返回的是files下的所有文件名
  • Context.deleteFile(),删除files下指定名称的文件
  • Context.getCacheDir(),该方法返回的是/data/data/com.example.test/cache的File对象.当Android的内部存储容量过低时,android会自动清除缓存文件.
  • getDir(String name,int mode),返回的是/data/data/com.example.test/下指定名称的文件夹的File对象

External Storage

 所有android设备都会提供外部存储,你可以用来保存文件,但是存储在外部存储的文件是完全公开的,并且可以被用户修改,外部存储可能无法获得,并且存储的文件的安全性很低,会被修改或者删除.
 获得 外部存储的访问权必须需要申请READ_EXTERNAL_STORAGE或者WRITE_EXTERNAL_STORAGE权限,如果申请了写权限,那么相应的读权限也获得啦.如果是Android 6.0,那么权限的申请可能就更加麻烦 :6.0新的权限管理系统
 在使用外部存储设备之前,必须先检查外部存储设备的挂载情况,然后再进行文件操作

/* 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;}

 如果你想存储一些可以和其他应用共享的文件时,一般存储在共享的文件夹中,比如Music/,’Pictures/’,’Ringtones/’通过Environment.getExternalStoragePublicDirectory,传递给其文件夹的类型,比如DIRECTORY_MUSIC,DIRECTORY_PICTURES,就可以获得响应文件夹的File对象.
 当你不想其他应用读取你的文件时,你可能需要使用私有文件夹.通过getExternalFilesDir(),并传递给其子文件夹的type,就可以打开响应的文件夹,在4.4之后,读取私有文件夹下的文件,是不需要外部存储设备权限的.
 外部存储设备的路径一般都以/mnt/sdcard开始,如下的一些函数获得路径如下:
- getExternalCacheDir() 获得/mnt/sdcard/Android/data/com.example.test/cache 文件夹的File对象
- getExternalFilesDir(type)获得/mnt/sdcard/Android/data/com.example.test/files文件夹下响应子文件夹的File对象
- Environment.getExternalStorageDiretory() 获得的是/mnt/sdcard文件夹的File对象
- Environment.getDataDirectory() 获得是的/data文件夹的File对象,需要注意的是,/data/data/Android/就是内部存储文件夹啦.
- Environment.getDownloadCacheDirectory() 获得的是/cache文件夹的File对象.

参考文章:
- android 系统文件路径.sdcard路径.外部路径
- Android Doc

更多相关文章

  1. android 系统启动
  2. 不需要任何权限获得Android设备的唯一ID
  3. Android的selector,背景选择器
  4. Android的Adapter用法理解
  5. android中的selector背景选择器
  6. Google Android应用开发04 Android应用程序结构
  7. Android中的文件权限操作
  8. Android(安卓)控件二 Button
  9. NPM 和webpack 的基础使用

随机推荐

  1. c语言数组怎么定义?
  2. c语言属于什么类型的编程语言
  3. 什么是虚函数
  4. 如何在C#中使用Bogus去创建模拟数据
  5. C# 快速手动构建文件服务器
  6. 在C/C++中如何使用extern关键字
  7. c#中反射是什么?
  8. c++输出二维字符矩阵对齐
  9. C++实现逐行读取txt文件中的字符串以及文
  10. openjudge 2971:抓住那头牛 解题过程(附代