Android中的文件读写操作是不可或缺的,每个应用都会涉及到读写操作。这里将读写操作分成了四个部分

  1. assets文件夹中文件数据的读取

  2. raw文件夹中的文件数据的读取

  3. Android内部存储文件的读写

  4. Android外部存储文件的读写


一、读取assets文件夹中的数据

assets文件夹 和 res文件夹 的区别:

  1. Android系统不为assets文件夹下的文件生成ID。如果使用assets下的文件,需要指定文件的路径和文件名。存放在assets文件夹中的资源不会生成id,但是存放在res目录下的资源会生成id。

  2. assets 和 res下的文件都是只能读不能写

  3. Android中的资源文件主要分为两类,一种出于assets目录下,称为原生文件,这类文件在被打包成apk文件时是不会进行压缩的;另一类则是res下的文件,这类文件在打包成apk文件时,会进行小内存优化 。

  4. 虽然通过一个字符串路径来获取这个目录下的文件描述符,访问的速度会慢。但是把一些文件放在这个目录下会使一些操作更加方便,比方说拷贝一个数据库文件到系统内存中。要注意的是,你无法在Android XML文件中引用到assets目录下的文件,只能通过AssetManager来访问这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。


  • 当我们使用Android studio创建Android工程项目的时候,assets文件夹不会自动创建,需要我们手动创建。这时我们必须在main目录下创建assets文件夹。

    如图:

  • 当我们使用Eclipse创建Android工程项目的时候,assets文件夹会自动创建。如果没有创建,我们也可以手动创建,目录如图:


文件夹创建好以后,我们往文件夹中存放文件,然后就可以通过代码获取到assets文件夹中的数据了

 try {InputStream is = getResources().getAssets().open("test.txt");InputStreamReader isr = new InputStreamReader(is,"UTF-8");BufferedReader br = new BufferedReader(isr);String str = "";while((str = br.readLine()) != null){tv.append(str+"\n");  //把test文档中的内容显示在tv中}} catch (IOException e) {e.printStackTrace();}

二、读取raw文件夹中的数据

raw文件夹是属于res目录下的,其中的资源会自动生成id,因此我们引用id就可以使用了。如果res目录下没有raw文件夹,我们可以自行在res目录下创建。这里不用区分编辑器目录的差别。目录结构如下:

获取资源代码如下:

 try {InputStream is = getResources().openRawResource(R.raw.test);InputStreamReader isr = new InputStreamReader(is,"UTF-8");BufferedReader br = new BufferedReader(isr);String str = "";while((str = br.readLine()) != null){tv.append(str+"\n");}} catch (IOException e) {e.printStackTrace();}

由于raw是Resources (res)的子目录,Android会自动的为这目录中的所有资源文件生成一个ID,这个ID会被存储在R类当中,作为一个文件的引用。这意味着这个资源文件可以很容易的被Android的类和方法访问到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是访问一个文件最快捷的方式。MP3和Ogg文件放在这个目录下是比较合适的。


三、内部存储文件的读写

Android内部存储文件指的是:应用程序安装后,都会在Android手机系统的data/data/目录下新建一个以应用包名为名的文件夹,在这个文件夹中会包含该应用程序的文件资源,我们称之为内部存储文件,用于区分SD卡
例如我们使用的例子,其目录为:data/data/redowu.file/


读写内部存储的文件的操作过程如下:

写入:

private String filename = "test.txt";
try {FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");osw.write(et.getText().toString());osw.flush();fos.flush();  //flush是为了输出缓冲区中所有的内容osw.close();fos.close();  //写入完成后,将两个输出关闭} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}

读取:

try {FileInputStream fis = openFileInput(filename);InputStreamReader isr = new InputStreamReader(fis,"UTF-8");char[] input = new char[fis.available()];  //available()用于获取filename内容的长度isr.read(input);  //读取并存储到input中isr.close();fis.close();//读取完成后关闭String str = new String(input); //将读取并存放在input中的数据转换成String输出tv.setText(str);
} catch (FileNotFoundException e) {e.printStackTrace();
} catch (UnsupportedEncodingException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
}


四、外部存储文件的读写

外部存储指的是SD卡。在读写SD卡中的文件数据前,我们要先在AndroidManifest中声明使用SD卡的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 1

SD卡文件的写入

File sdcard = Environment.getExternalStorageDirectory();//获取sd卡路径
File myfile = new File(sdcard,"file.txt");  //实例化一个File
if (sdcard.exists()){  //判断是否有sd卡try {myfile.createNewFile();   //创建myfile.txtFileOutputStream fos = new FileOutputStream(myfile);OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");osw.write(et.getText().toString());osw.flush();fos.flush();osw.close();fos.close();} catch (IOException e) {e.printStackTrace();}
}else {System.out.println("没有sd卡");
}

file.txt是创建在sd卡的根目录的,我们可以在ddms中查看,这里我们需要查找sdcard的目录。我使用的虚拟机sd卡的目录查找步骤:

  1. 首先在虚拟机根目录能直接看到sdcard目录,然后我们查看他的info指向目录:/storage/emulated/legacy

  2. 接下来我们进入/storage/emulated/legacy目录,但是啥都没有,但是这个目录的info指向了另一个目录:/mnt/shell/emulated/0

  3. 我们进入/mnt/shell/emulated/0,此时我们才算找到了sdcard的真实目录,file.txt就创建在这个目录下


SD卡文件数据的读取

File sdcard = Environment.getExternalStorageDirectory();
File file = new File(sdcard,"file.txt");
try {FileInputStream fis = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fis,"UTF-8");char[] input  = new char[fis.available()]; isr.read(input);isr.close();fis.close();String str = new String(input);tv.setText(str);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}

注意:

  1. InputStream 、OutputStream、FileInputStream 、FileOutputStream操作的是字节流

  2. InputStreamReader 、OutputStreamWriter操作的是字符流

  3. 英文一个字符占一个字节,而中文一个字符占俩字节。如果用stream,读出来的英语再倒也罢了,但读出来的中文就会出现乱码。

Android文件读写操作(assets 文件、 raw文件、内部存储文件、外部存储文件)相关推荐

  1. java 读取raw文件_Android 读取assets和raw文件内容实例代码

    这篇文章主要介绍了Android 读取assets和raw文件内容的相关资料,并附简单实例代码,需要的朋友可以参考下 android之文件操作--读取assets和raw文件下的内容 1.分别创建as ...

  2. Android Kotlin 文件读写操作扩展函数,Raw资源读取,Assets资源读取

    1.保存内容到文件及文件读取 /*** 保存信息到File* @param fileName 文件名* @param content 保存内容* @param mode 模式*/ fun Contex ...

  3. Android项目中的assets和raw文件夹

    直接参考这篇文章 Assets文件夹和raw文件夹的区别 转载于:https://www.cnblogs.com/feng-ye/p/7026594.html

  4. php中文件读写总结,PHP中文件读写操作

    PHP中文件读写操作 PHP中提供了一系列的I/O函数,能简捷地实现我们所需要的功能,包括文件系统操作和目录操作(如"复制[copy]").下面给大家介绍的是基本的文件读写操作:( ...

  5. IOS 文件读写操作详解及简单实例

    iPhone 文件读写操作 1,写文件操作 - (IBAction)btnWrite:(id)sender {//创建文件管理器NSFileManager *fileManager = [NSFile ...

  6. python 文件读写操作总结

    python 文件读写操作总结 1.打开文件 open函数是python的内置函数,返回一个 file 对象 定义如下: open(file, mode='r', buffering=-1, enco ...

  7. Android - 文件读写操作 总结

    http://blog.csdn.net/ztp800201/article/details/7322110 在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中 ...

  8. 【转】Android - 文件读写操作 总结

    Android - 文件读写操作 总结 原文出处:http://blog.csdn.net/ztp800201/article/details/7322110 在android中的文件放在不同位置,它 ...

  9. Android中的文件读写操作

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

最新文章

  1. 从 Domino 7.x 升级到 Domino 8.0.1 后服务器性能下降
  2. 手机开发必备技巧:javascript及CSS功能代码分享
  3. 开源工具高效分析Java应用
  4. 《从零开始学Swift》学习笔记(Day 70)——Swift与Objective-C混合编程之Swift与Objective-CAPI映射...
  5. 【数据结构与算法】之深入解析“单词接龙II”的求解思路与算法示例
  6. 2017西安交大ACM小学期 文本查找[AC自动机]
  7. Python程序计算给定文本中单词的出现
  8. NumPy快速入门-- Less 基础/线性代数
  9. 二月春风似剪刀的上一句是什么,二月春风似剪刀全诗赏析
  10. 通过反编译让SpecFlow支持多层属性值的验证
  11. 动态分配内存的初始化
  12. poj 3468 A Simple Problem with Integers 基础线段树
  13. 算法第四版 练习答案 1.4.1
  14. 伊甸园日历游戏(vijos--1004)
  15. php处理抢购类功能的高并发请求,php处理抢购类
  16. Win10系统在当前文件夹下打开cmd(命令行)窗口
  17. Kaggle教程 机器学习中级3 分类变量
  18. 2019年安徽省大学生计算机博弈大赛,2019年辽宁省普通高等学校本科大学生计算机博弈竞赛在我校成功举行...
  19. 工具篇 | 获取邮箱的登陆授权码
  20. 全球十大外汇黄金交易平台排名

热门文章

  1. Kotlin高仿微信-第6篇-主页-我的
  2. 工作11年,35岁,裸辞: 感到前途很迷茫,如何破?
  3. img实现图片加载前默认图片,加载时替换真实图片,加载失败时替换加载失败图片
  4. Telnet远程和tracert跟踪命令
  5. python怎么安装turtle_Turtle模块安装
  6. Dell xps13 win10 安装于PCI-E SSD
  7. linux运维每天都要做什么,Linux运维工作清闲吗?每天需要干什么?
  8. 如何开启GBase XDM的操作日志
  9. request canceled (Client.Timeout exceeded while awaiting headers)
  10. NOAA网站气象台站数据下载教程