本文目录

  • Android文件读写概述
  • 读取raw目录文件
  • 读取assets目录文件
  • data/data/(包名) 目录文件读写
    • 写数据
    • 读数据
  • sdcard文件读写
    • 申请动态权限
    • 写数据
    • 读数据
    • sdcard文件读写完整代码

推荐阅读:
Android 通过HttpURLConnection访问Http协议网络
Android SQlite数据库使用详解
Android xUtils框架最全使用详解
Android 动态权限最全解析

Android文件读写概述


在Androi中文件读写一共有以下目录

  • raw目录
  • asserts目录
  • data/data/包名
  • sdcard目录

其中raw下的和asserts下的文件可以以资源文件的形式读取,这些目录的数据只能读取,不能写入,两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
data/data/包名sdcard目录文件可读可写。其中data/data/包名目录不需要申请权限,sdcard目录需要申请权限

读取raw目录文件

Android工程默认是没有raw文件夹的在读文件前我们先把raw 文件夹以及文件建好

  • 点中工程的res目录 右键New -> Directory -> 弹窗中输入raw
  • 点中刚刚新建的raw目录 右键New -> File -> 弹窗中输入test.txt
  • 点开刚刚新建的test.txt文件 ,往里面输入hello world

    读数据方法
   InputStream inputStream = null;Reader reader = null;BufferedReader bufferedReader = null;try {//得到资源中的Raw数据流inputStream = getResources().openRawResource(R.raw.test);reader = new InputStreamReader(inputStream);// 字符流bufferedReader = new BufferedReader(reader); //缓冲流StringBuilder result = new StringBuilder();String temp;while ((temp = bufferedReader.readLine()) != null) {result.append(temp);}Log.i("MainActivity", "result:" + result);} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}

从打印的结果中我们可以看出数据读取成功

读取assets目录文件

Android工程默认是没有assets文件夹的,在读文件前我们先把assets 文件夹以及文件建好

  • 点中工程 右键New -> Folder -> Assets Folder
  • 点中刚刚新建的Assets Folde目录 右键New -> File -> 弹窗中输入test.txt
  • 点开刚刚新建的test.txt文件 ,往里面输入hello world

  • 读去assets文件中的数据方法
     InputStream inputStream = null;Reader reader = null;BufferedReader bufferedReader = null;try {//得到资源中的asset数据流inputStream = getResources().getAssets().open("test.txt");reader = new InputStreamReader(inputStream);// 字符流bufferedReader = new BufferedReader(reader); //缓冲流StringBuilder result = new StringBuilder();String temp;while ((temp = bufferedReader.readLine()) != null) {result.append(temp);}Log.i("MainActivity", "result:" + result);} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}

从打印的结果中我们可以看出数据读取成功

data/data/(包名) 目录文件读写

将数据以普通文件的形式保存在 /data/data/包名中,该方法不需要申请权限。
存放在数据区(/data/data/包名)的文件可以使用openFileOutputopenFileInput进行操作。
也可以直接指定文件/data/data/包名路径读写。

该目录存放文件类型规则如下:

路径 功能
data/data/包名/shared_prefs 存放SharedPreferences数据
data/data/包名/databases 存放数据库数据
data/data/包名/files 存放普通数据
data/data/包名/cache 存放缓存文件

写数据

方法1:openFileOutput

        FileOutputStream fileOutputStream = null;try {String text = "hello world";fileOutputStream = openFileOutput("test.txt", MODE_PRIVATE);fileOutputStream.write(text.getBytes());} catch (Exception e) {e.printStackTrace();} finally {if (fileOutputStream != null) {try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}

openFileOutput方法参数详解

 @Overridepublic FileOutputStream openFileOutput(String name, int mode)throws FileNotFoundException {}
  • name 存储文件名字
  • mode 存储方式 其值的含义如下
参数值 参数含义
Context.MODE_PRIVATE 指定该文件数据只能被本应用程序读、写
Context.MODE_WORLD_READABLE 指定该文件数据能被其他应用程序读,但不能写
Context.MODE_WORLD_WRITEABLE 指定该文件数据能被其他应用程序读
Context.MODE_APPEND 该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;

方法2:传统方法读写

   String text = "hello world";File file1=new File("/data/data/com.lucashu.file/","test.txt");FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(file1);fileOutputStream.write(text.getBytes());} catch (Exception e) {e.printStackTrace();}finally {if (fileOutputStream != null) {try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}

执行以后我们可以看到添加了一个文件

读数据

方法1:openFileInput

     FileInputStream fileInputStream = null;Reader reader = null;BufferedReader bufferedReader = null;try {fileInputStream = openFileInput("test.txt");reader = new InputStreamReader(fileInputStream);// 字符流bufferedReader = new BufferedReader(reader); //缓冲流StringBuilder result = new StringBuilder();String temp;while ((temp = bufferedReader.readLine()) != null) {result.append(temp);}Log.i("MainActivity", "result:" + result);} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (fileInputStream != null) {try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}

方法2:openFileInput

     InputStream inputStream = null;Reader reader = null;BufferedReader bufferedReader = null;try {File file=new File("/data/data/com.lucashu.file/", "test.txt");inputStream = new FileInputStream(file);reader = new InputStreamReader(inputStream);bufferedReader = new BufferedReader(reader);StringBuilder result = new StringBuilder();String temp;while ((temp = bufferedReader.readLine()) != null) {result.append(temp);}Log.i("MainActivity", "result:" + result);} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}

从打印的结果中我们可以看出数据读取成功


我们也可以用一下方法来获取改文件的路径

getFilesDir();// data/data/包名/files 目录
getFilesDir().getParent(),;// data/data/包名/ 目录

sdcard文件读写

sdcard读写的数据将数据保存在 /mnt/sdcard目录,该目录读写需要先申请动态权限,动态权限申请方法如下

申请动态权限

Android 动态权限最全解析

首先需要在manifest.xml中添加权限

<!--文件读写权限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

如果是AndroidQ 或者更高的版本还需要在manifest.xml文件中的application节点下加入
android:requestLegacyExternalStorage="true"
申请动态权限方法:

private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE","android.permission.WRITE_EXTERNAL_STORAGE"};private void checkPermission() {//检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show();}//申请权限ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);} else {Toast.makeText(this, "已授权成功!", Toast.LENGTH_SHORT).show();writeSdcard();}
}

Activity中动态权限的回调方法

@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {switch (requestCode) {case REQUEST_EXTERNAL_STORAGE: {if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();writeSdcard();} else {Toast.makeText(this, "授权被拒绝!", Toast.LENGTH_SHORT).show();}return;}}
}

写数据

private void writeSdcard()  {String text = "hello world";if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File storage = Environment.getExternalStorageDirectory();File tmepfile = new File(storage.getPath());if (! tmepfile.exists()) {tmepfile.mkdirs();}File file1=new File(tmepfile,"test.txt");if (!file1.exists()){try {file1.createNewFile();} catch (IOException e) {e.printStackTrace();}}FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(file1);fileOutputStream.write(text.getBytes());} catch (Exception e) {e.printStackTrace();}finally {if (fileOutputStream != null) {try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}}

执行以后我们可以看到添加了一个文件

读数据

private void readSdcard() {if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {InputStream inputStream = null;Reader reader = null;BufferedReader bufferedReader = null;try {File storage = Environment.getExternalStorageDirectory();File tmepfile = new File(storage.getPath());File file=new File(tmepfile, "test.txt");inputStream = new FileInputStream(file);reader = new InputStreamReader(inputStream);bufferedReader = new BufferedReader(reader);StringBuilder result = new StringBuilder();String temp;while ((temp = bufferedReader.readLine()) != null) {result.append(temp);}Log.i("MainActivity", "result:" + result);} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}}}}

sdcard文件读写完整代码

package com.lucashu.file;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);checkPermission();}private void writeSdcard()  {String text = "hello world";if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File storage = Environment.getExternalStorageDirectory();File tmepfile = new File(storage.getPath());if (! tmepfile.exists()) {tmepfile.mkdirs();}File file1=new File(tmepfile,"test.txt");if (!file1.exists()){try {file1.createNewFile();} catch (IOException e) {e.printStackTrace();}}FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(file1);fileOutputStream.write(text.getBytes());} catch (Exception e) {e.printStackTrace();}finally {if (fileOutputStream != null) {try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}}private void readSdcard() {if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {InputStream inputStream = null;Reader reader = null;BufferedReader bufferedReader = null;try {File storage = Environment.getExternalStorageDirectory();File tmepfile = new File(storage.getPath());File file=new File(tmepfile, "test.txt");inputStream = new FileInputStream(file);reader = new InputStreamReader(inputStream);bufferedReader = new BufferedReader(reader);StringBuilder result = new StringBuilder();String temp;while ((temp = bufferedReader.readLine()) != null) {result.append(temp);}Log.i("MainActivity", "result:" + result);} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}}}}private static final int REQUEST_EXTERNAL_STORAGE = 1;private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE","android.permission.WRITE_EXTERNAL_STORAGE"};private void checkPermission() {//检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show();}//申请权限ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);} else {Toast.makeText(this, "已授权成功!", Toast.LENGTH_SHORT).show();readSdcard();}}@Overridepublic void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {switch (requestCode) {case REQUEST_EXTERNAL_STORAGE: {if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();readSdcard();} else {Toast.makeText(this, "授权被拒绝!", Toast.LENGTH_SHORT).show();}return;}}}}

作者:lucashu
出处:https://blog.csdn.net/huweiliyi/category_8913738.html
原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

Android 文件读写最全解析相关推荐

  1. Android异步加载全解析之引入二级缓存

    Android异步加载全解析之引入二级缓存 为啥要二级缓存 前面我们有了一级缓存,为啥还要二级缓存呢?说白了,这就和电脑是一样的,我们电脑有内存和硬盘,内存读取速度快,所以CPU直接读取内存中的数据, ...

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

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

  3. android文件读写操作布局文件代码,android实现文件读写功能

    本文实例为大家分享了android实现文件读写功能的具体代码,供大家参考,具体内容如下 读取: public static String _getJsonString(String fileName) ...

  4. Android文件读写操作(assets 文件、 raw文件、内部存储文件、外部存储文件)

    Android中的文件读写操作是不可或缺的,每个应用都会涉及到读写操作.这里将读写操作分成了四个部分 assets文件夹中文件数据的读取 raw文件夹中的文件数据的读取 Android内部存储文件的读 ...

  5. android 文件读写概述

    (1)data/data下面主要是/data/data/Package Name目录, 该目录下面主要是/data/data/Package Name/Shared_Pref, /data/data/ ...

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

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

  7. Android fragment源码全解析

    Fragment 相信基本上每个android developer都用过,但是知晓其原理 用的好的还是不多,今天就从源码的角度上来带着大家分析一下Fragment的源码,对fragment有了更深层次 ...

  8. Android:文件读写.

    //往SD卡写入文件的方法public void savaFileToSD(String filename, String filecontent) throws Exception {//如果手机已 ...

  9. Android 多窗口框架全解析

    转载: https://blog.csdn.net/xiaosayidao/article/details/75045087 Android N的的多窗口框架中,总共包含了三种模式. Split-Sc ...

最新文章

  1. camera数字降噪(DNR)
  2. 在物体检测任务上进行预训练的实验分析
  3. 学习笔记(46):Python实战编程-protocol
  4. 贵州大学计算机专业的导师是谁,贵州大学计算机科学与信息学院导师介绍:王以松...
  5. 7.8 服务暴露总结
  6. Quartus17打开RTL视图
  7. Grub 2:拯救你的 bootloader
  8. 点云投影_激光点云变换到图像平面并保存成int16灰度图一帧激光点云+一张RGB图像得到彩色点云
  9. 驱动实验准备篇(如何给驱动签名)
  10. 微信小程序项目实例——打卡时钟
  11. 约约约,文章约起来!
  12. 我们为什么选择计算机专业?为什么学习编程?
  13. 动图静图怎么拼接在一起?教你一键快速拼接图片
  14. 保密工作人员计算机方面知识,【保密知识】个人,如何做好保密工作?4个方面...
  15. 电路原理入门书籍推荐
  16. oracle数据库报错,ORA-01652:无法通过128(在表空间TEMP中)扩展temp段
  17. Andrew Ng 深度学习课程——序列模型
  18. python云端系统开发_Python云端系统开发入门
  19. 机器学习笔记 - YOLO家族简介
  20. 架构师之路,2020半年精选!!!

热门文章

  1. Hypermesh2019使用教程(二 底部状态栏提示:A shape muest be selected)
  2. 华为nova3e怎么分屏_华为MatePad 5G发布:强劲5G赋能,开启全民5G体验
  3. MySQL锁相关面试题
  4. mac os 安装win8.1后BootCamp 控制面板无法设置触摸板
  5. 华硕X442URR 黑苹果efi引导文件
  6. GBase 8s 产品架构介绍
  7. uiautomatorviewer不能直接截取手机屏幕信息,尝试了好多种办法,终于解决了
  8. 基于paddlehub的粉圈微博生成
  9. android videoview截屏,获取视频截图
  10. pmsm simulink foc 仿真模型搭建