Android中的文件读写操作
在android开发中文件操作使用的其实还是比较高频的,之前我遇到这种需求都随便写写,对此没有一个比较全面的认识,所以想借这篇文章来梳理一遍。
由于需要读写文件,这包含了读写外部sd card的文件,所以需要添加对饮的读写权限
<!-- SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!--读取SDCard数据权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><!-- 向SDCard写入数据权限 -->
<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这个路径的。
另外我们还可以根据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在手机中的路径如下
看的出来,手机上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 Cardif (storageState.equals(Environment.MEDIA_MOUNTED)) {//路径: /storage/emulated/0/Android/data/com.yoryky.demo/cache/yoryky.txtfilename = 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中的文件获取方式。
Android中的文件读写操作相关推荐
- python中的文件读写操作
python中的文件读写操作 思维导图 Python读写CSV文件 csv文件是什么? CSV(Comma Separated Values)全称逗号分隔值文件是一种简单.通用的文件格式,被广泛的应用 ...
- C++中的文件读写操作(1)
#include "iostream" #include "fstream" #include "vector" #include &quo ...
- python 中的文件读写操作 and 例题
一.概述 在文件的读写操作中,python是相对容易学的,python对文件进行操作只需要使用open()创建一个file流对象,用这个对象对文件进行读和写操作.open()有两个参数,一个是url是 ...
- C++中的文件读写操作(2)
#include "iostream" #include "fstream" #include "vector" #include &quo ...
- Android文件读写操作(assets 文件、 raw文件、内部存储文件、外部存储文件)
Android中的文件读写操作是不可或缺的,每个应用都会涉及到读写操作.这里将读写操作分成了四个部分 assets文件夹中文件数据的读取 raw文件夹中的文件数据的读取 Android内部存储文件的读 ...
- android 生成aar文件,Android 中.aar文件生成方法与用法
https://i.cnblogs.com/EditPosts.aspx?opt=1 无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Ja ...
- android 读写文件 简书,Android 中的文件操作
Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...
- Android - 文件读写操作 总结
http://blog.csdn.net/ztp800201/article/details/7322110 在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中 ...
- 【转】Android - 文件读写操作 总结
Android - 文件读写操作 总结 原文出处:http://blog.csdn.net/ztp800201/article/details/7322110 在android中的文件放在不同位置,它 ...
最新文章
- AI大觉醒:图灵奖得主Bengio称AI将产生意识,未来机器学习核心是注意力机制
- javascript DOM(08-21)
- 自适应高度表格_【干货分享】Word制作表格,这几个技巧必须要学会!
- Tomcat下载步骤
- 百度移动联盟(munion)-广告平台投放流程详细介绍 (绿色通道)
- VS Code 批量操作
- Java集合——概述
- 应用优化前心路历程~
- 数学建模-7.多元线性回归分析
- Java手写线程池(不带返回值、带返回值)
- php redis 日志模式,Redis的PHP客户端
- ubuntu20.04下开发海康威视网络摄像头sdk(一)运行示例程序
- 机器学习 Machine Learning- 吴恩达Andrew Ng 第21~25课总结
- Nsight Compute 使用
- 2020年美赛C题(数据分析题)O奖论文笔记 (1)
- android音频切换到蓝牙耳机,在Android上将音频路由到蓝牙耳机(非A2DP)
- 软考计算机系统知识试题,计算机软考中级考试试题及答案
- 写给静不下心来的朋友们
- 深信服设备连接linux,deepin官方论坛-深度科技官网旗下网站
- grep 忽略大小写、忽略grep命令本身