Android 文件读写最全解析
本文目录
- 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/包名
)的文件可以使用openFileOutput
和openFileInput
进行操作。
也可以直接指定文件/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 文件读写最全解析相关推荐
- Android异步加载全解析之引入二级缓存
Android异步加载全解析之引入二级缓存 为啥要二级缓存 前面我们有了一级缓存,为啥还要二级缓存呢?说白了,这就和电脑是一样的,我们电脑有内存和硬盘,内存读取速度快,所以CPU直接读取内存中的数据, ...
- 【转】Android - 文件读写操作 总结
Android - 文件读写操作 总结 原文出处:http://blog.csdn.net/ztp800201/article/details/7322110 在android中的文件放在不同位置,它 ...
- android文件读写操作布局文件代码,android实现文件读写功能
本文实例为大家分享了android实现文件读写功能的具体代码,供大家参考,具体内容如下 读取: public static String _getJsonString(String fileName) ...
- Android文件读写操作(assets 文件、 raw文件、内部存储文件、外部存储文件)
Android中的文件读写操作是不可或缺的,每个应用都会涉及到读写操作.这里将读写操作分成了四个部分 assets文件夹中文件数据的读取 raw文件夹中的文件数据的读取 Android内部存储文件的读 ...
- android 文件读写概述
(1)data/data下面主要是/data/data/Package Name目录, 该目录下面主要是/data/data/Package Name/Shared_Pref, /data/data/ ...
- Android - 文件读写操作 总结
http://blog.csdn.net/ztp800201/article/details/7322110 在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中 ...
- Android fragment源码全解析
Fragment 相信基本上每个android developer都用过,但是知晓其原理 用的好的还是不多,今天就从源码的角度上来带着大家分析一下Fragment的源码,对fragment有了更深层次 ...
- Android:文件读写.
//往SD卡写入文件的方法public void savaFileToSD(String filename, String filecontent) throws Exception {//如果手机已 ...
- Android 多窗口框架全解析
转载: https://blog.csdn.net/xiaosayidao/article/details/75045087 Android N的的多窗口框架中,总共包含了三种模式. Split-Sc ...
最新文章
- camera数字降噪(DNR)
- 在物体检测任务上进行预训练的实验分析
- 学习笔记(46):Python实战编程-protocol
- 贵州大学计算机专业的导师是谁,贵州大学计算机科学与信息学院导师介绍:王以松...
- 7.8 服务暴露总结
- Quartus17打开RTL视图
- Grub 2:拯救你的 bootloader
- 点云投影_激光点云变换到图像平面并保存成int16灰度图一帧激光点云+一张RGB图像得到彩色点云
- 驱动实验准备篇(如何给驱动签名)
- 微信小程序项目实例——打卡时钟
- 约约约,文章约起来!
- 我们为什么选择计算机专业?为什么学习编程?
- 动图静图怎么拼接在一起?教你一键快速拼接图片
- 保密工作人员计算机方面知识,【保密知识】个人,如何做好保密工作?4个方面...
- 电路原理入门书籍推荐
- oracle数据库报错,ORA-01652:无法通过128(在表空间TEMP中)扩展temp段
- Andrew Ng 深度学习课程——序列模型
- python云端系统开发_Python云端系统开发入门
- 机器学习笔记 - YOLO家族简介
- 架构师之路,2020半年精选!!!
热门文章
- Hypermesh2019使用教程(二 底部状态栏提示:A shape muest be selected)
- 华为nova3e怎么分屏_华为MatePad 5G发布:强劲5G赋能,开启全民5G体验
- MySQL锁相关面试题
- mac os 安装win8.1后BootCamp 控制面板无法设置触摸板
- 华硕X442URR 黑苹果efi引导文件
- GBase 8s 产品架构介绍
- uiautomatorviewer不能直接截取手机屏幕信息,尝试了好多种办法,终于解决了
- 基于paddlehub的粉圈微博生成
- android videoview截屏,获取视频截图
- pmsm simulink foc 仿真模型搭建