在android开发中文件操作使用的其实还是比较高频的,之前我遇到这种需求都随便写写,对此没有一个比较全面的认识,所以想借这篇文章来梳理一遍。

由于需要读写文件,这包含了读写外部sd card的文件,所以需要添加对饮的读写权限

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

1、获取存储路径

android可能有两个地方可以存储文件,一是存放在sd卡中(如果有的话),另外就是存储在内存卡中,那么与此对应的就有两组方法来获取存储路径。

a、获取sd卡相关路径的方法

关于获取sd卡相关路径方法和获取到的路径的对应关系如下

Environment.getExternalStorageDirectory().getAbsolutePath()/storage/emulated/0
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath())/storage/emulated/0/DCIM

这两个方法是通过Environment提供的方法来获取sd卡路径,可以看到的获取的基本是sd卡的根路径,而实际上/storage/emulated/0这个路径代表是的第一行sd卡,当我们在该路径下创建yoryky.txt文件时,实际手机上看到的路径是/存储盘/yoryky.txt,根本是找不到/storage/emulated/0这个路径的。

Android中的文件读写操作_第1张图片

另外我们还可以根据Context对象提供的方法来获取sd卡的存储路径

getExternalCacheDir().getAbsolutePath()/storage/emulated/0/Android/data/packagename/cache

该路径会在sd卡下Android/data/路径下创建packagename路径并最终创建一个cahce目录,在删除app时,这个目录也会被删除。

getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath:/storage/emulated/0/Android/data/packagename/files/Pictures

这个路径是在上面讲到cache目录的同级目录下创建一个files目录,并在其中闯将存放图片的Pictures目录。getExternalFilesDir方法中可以传多种参数,例如还可以传Environment.DIRECTORY_DCIM这个参数一遍在files目录下创建DCIM这个目录。

由此我们知道获取sd卡路径的方法有两套,一套是通过Environment类获取packagename无关的路径,一套是通过Context类获取packagename相关的路径,packagename路径下可以有cache和files两个目录。

这里的cache以及files两个目录在手机中的路径为/存储盘/sd/Android/data/packagename/中。

b、获取内存卡相关路径方法

和获取sd卡路径不同,获取内存卡路径不能通过Environment类来获取,只能通过Context来获取

getCacheDir().getAbsolutePath()/data/user/0/packagename/cache
getFilesDir().getAbsolutePath()/data/user/0/com.yoryky.demo/files

可以看出Context提供的两个方法,一个用来获取cache目录路径,一个用来获取files目录路径。这个的/data/user/0/代表多用户(android 4.2版本开始支持多用户)中的第一个用户的存储路径,这个在手机上也是找不到的,实际上cache和files在手机中的路径如下

Android中的文件读写操作_第2张图片

看的出来,手机上cache和files的实际路径为/存储盘/Android/data/packagename/。

2、读写sd card路径中文件

第一小节讲了获取sd卡目录路径以及内存卡目录路径的方法,这里先来说说读写sd卡路径中文件的方法实现

a、写sd卡中的文件方法

这里通过FileOutputStream类来实现写sd卡文件

/** * 将内容写入sd卡中 * @param filename 要写入的文件名 * @param content  待写入的内容 * @throws IOException */public static void writeExternal(Context context, String filename, String content) throws IOException {    //获取外部存储卡的可用状态    String storageState = Environment.getExternalStorageState();    //判断是否存在可用的的SD Card    if (storageState.equals(Environment.MEDIA_MOUNTED)) {        //路径: /storage/emulated/0/Android/data/com.yoryky.demo/cache/yoryky.txt        filename = context.getExternalCacheDir().getAbsolutePath()  + File.separator + filename;        FileOutputStream outputStream = new FileOutputStream(filename);        outputStream.write(content.getBytes());        outputStream.close();    }}

这个代码很简单,而且注释也很详细,这里就不解释了。

b、读sd卡中的文件方法

通过FileInputStream来获取sd卡中对应文件的内容

/** * 从sd card文件中读取数据 * @param filename 待读取的sd card * @return * @throws IOException */public static String readExternal(Context context, String filename) throws IOException {    StringBuilder sb = new StringBuilder("");    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){        filename = context.getExternalCacheDir().getAbsolutePath() + File.separator + filename;        //打开文件输入流        FileInputStream inputStream = new FileInputStream(filename);        byte[] buffer = new byte[1024];        int len = inputStream.read(buffer);        //读取文件内容        while(len > 0){            sb.append(new String(buffer,0,len));            //继续将数据放到buffer中            len = inputStream.read(buffer);        }        //关闭输入流        inputStream.close();    }    return sb.toString();}

通过FileInputStream对象遍历便可以获取对应文件中的内容。

3、读写内存卡中的文件

其实续写内存卡中的文件方法和读写sd卡文件方法基本一致,就是文件路径改变了而已。

a、写内存卡中文件方法

这里也直接给出实现

/** * 写Internal Card文件 * @param context * @param filename * @param content * @throws IOException */public static void writeInternal(Context context, String filename, String content) throws IOException{    //获取文件在内存卡中files目录下的路径    File file = context.getFilesDir();    filename = file.getAbsolutePath() + File.separator + filename;    //打开文件输出流    FileOutputStream outputStream = new FileOutputStream(filename);    //写数据到文件中    outputStream.write(content.getBytes());    outputStream.close();}

这里还是通过FileOutputStream类来写数据到文件中。

b、读内存卡中文件方法

还是直接给代码

/** * 读内存卡中文件方法 * @param context   * @param filename 文件名 * @return * @throws IOException */public static String readInternal(Context context,String filename) throws IOException{    StringBuilder sb = new StringBuilder("");    //获取文件在内存卡中files目录下的路径    File file = context.getFilesDir();    filename = file.getAbsolutePath() + File.separator + filename;    //打开文件输入流    FileInputStream inputStream = new FileInputStream(filename);    byte[] buffer = new byte[1024];    int len = inputStream.read(buffer);    //读取文件内容    while(len > 0){        sb.append(new String(buffer,0,len));        //继续将数据放到buffer中        len = inputStream.read(buffer);    }    //关闭输入流    inputStream.close();    return sb.toString();}

这里依然通过FileInputStream来获取文件中的数据。

到这里读写sd卡以及内存卡中的文件方法就算是写完了,实际上有这四个方法,我么就可以封装一个自己的FileUtil类来专门处理文件的读写操作了。这里还是给一个demo地址吧,Android Demo.

4、参考文献

1、Android常见文件路径介绍

2、Android读写文件

3、Android SD卡简单的文件读写操作

4、Android 文件的读取和写入

这几个参考文献可好好看看,特别是前两篇,第一篇说清楚了sd卡和内存卡路径的作用和获取方式,而第二篇说清了android中其它文件的获取方式宝座资源文件以及assets中的文件获取方式。

更多相关文章

  1. Android手机软件汉化教程---第三课 xml文件汉化
  2. android 程序开发的插件化 模块化方法
  3. android studio 3.x 以上版本的Native JNI/NDK 调用c++/c语言程
  4. Android WebView 不支持 H5 input type="file" 解决方法
  5. 在Android App开发中实现任意Java方法的拦截
  6. 关于Android长按出现复制粘贴栏在顶部占位问题解决方法
  7. Android进程保活方法 --转自腾讯Bugly公众号
  8. 【Android软件】ES文件浏览器:Android资源管理器

随机推荐

  1. Android--自定义SeekBarPreference控件
  2. Android SDK和最新ADT下载地址
  3. Linux 统计代码行数
  4. 【Android】hwbinder的selinux配置
  5. Android的各种onTouch
  6. Android Style.xml 详解
  7. android 安装apk包 卸载 包
  8. Android 使用CoordinatorLayout+AppBarLa
  9. [Android] Fastest Way to Get on Track
  10. android studio SDK版本的调节