首先得获取文件读写的权限可以在AndroidManifest中进行获取文件读写实验
对于Android版本较高的手机需要动态获取权限 动态获取权限可以参考之前发布的一篇文章https://blog.csdn.net/wangzibai/article/details/83048046
其实Android中的读写文件和java中的唯一区别就是Android的文件路径可能较为不同
这里列出Android SD卡的文件路径:
private String DIR = Environment.getExternalStorageDirectory().getAbsolutePath();
后面可以加具体想读写的文件路径 如下:
private String FEED_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyCache/" + "FeedType.txt";
其实文件的读写属于耗时操作 可以在子线程中进行(网络访问或数据库查询属于耗时长的操作)
这里介绍一下Android自带的子线程AsyncTask
AsyncTask可以正确,方便地使用UI线程。此类允许您执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。
AsyncTask 允许对用户界面执行异步操作。 它会先阻塞工作线程中的操作,然后在 UI 线程中发布结果,而无需您亲自处理线程和/或处理程序。
要使用它,必须创建 AsyncTask 的子类并实现 doInBackground() 回调方法,该方法将在后台线程池中运行。 要更新 UI,应该实现 onPostExecute() 以传递 doInBackground() 返回的结果并在 UI 线程中运行,以便您安全地更新 UI。 稍后,您可以通过从 UI 线程调用 execute() 来运行任务。
使用:
public class getTask extends AsyncTask{
//todo:文件操作 通过文件进行数据的永久保存 首先检测文件是否存在不存在则创建初始化 存在则跳过直接取值
@Override
protected Boolean doInBackground(Void... params) {
try {
Thread.sleep(500);
//todo:创建文件以及从中取值
File feedTypeFile = new File(FEED_DIR);
//检测sd卡是否安装
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Log.e("sd卡","存在");
//文件不存在
if(!feedTypeFile.exists()){
//先创建文件夹/目录
feedTypeFile.getParentFile().mkdirs();
//再创建新文件
feedTypeFile.createNewFile();
Log.e("feedTypeFile","创建成功");
//向文件中写入数据
FileOutputStream fos = new FileOutputStream(FEED_DIR);
//将要写入的数据转化为二进制数据
byte[] bytes = feedTypeString.getBytes();
//二进制数据写入文件中
fos.write(bytes);
//关闭文件输出流
fos.close();
}
}
//第一次才创建文件向文件写入数据 如果数据存在则从文件中读取数据
feedTypeList = fileUtil.readTextFile(FEED_DIR);
} catch (Exception e) {
e.printStackTrace();
}
return success;
}
@Override
protected void onPostExecute(Boolean b) {
super.onPostExecute(b);
//在此更改UI
}
}
具体的文件读写实例:
/**
* Description:
* Data:2018/10/12-15:28
* Author: satsuki
*/
public class FileUtil {
//从文件中取值通过split转换成List返回显示
public ListreadTextFile(String filePath){
ListfeedTypeList = new ArrayList<>();
String feedType;
String[] feedTypes;
//StringBuffer初始化
StringBuffer feedTypeStringBuffer=new StringBuffer();
// feedTypeStringBuffer.append("");
String lineTxt = null;
File file = new File(filePath);
//文件读写会产生异常所以要放在try catch中
try{
//判断文件存在
if(file.isFile()&&file.exists()){
Log.e("文件","存在");
//读取字节流 utf-8是字符编码方式 可以根据具体情况进行更改
InputStreamReader read = new InputStreamReader(new FileInputStream(file),"utf-8");
BufferedReader bufferedReader = new BufferedReader(read);
while ((lineTxt = bufferedReader.readLine())!=null){
feedTypeStringBuffer.append(lineTxt);
Log.e("读取的数据:",feedTypeStringBuffer.toString());
}
//通过split转换成list返回
feedType = feedTypeStringBuffer.toString();
feedTypes = feedType.split(" ");
for (String feed:feedTypes){
feedTypeList.add(feed);
}
read.close();
}
}catch (Exception e){
e.printStackTrace();
}
return feedTypeList;
}
public void writeTextFile(String filePath,ListfeedTypeList){
File file = new File(filePath);
String feedTypeString=null;
StringBuffer feedTypeStringBuffer=new StringBuffer();
// feedTypeStringBuffer.append("");
try {
//不存在则创建
if(!file.exists()){
file.getParentFile().mkdirs();
file.createNewFile();
Log.e("feedTypeFile","创建成功");
}
//从list转换成带空格的String
for(String feed:feedTypeList){
feedTypeStringBuffer.append(feed);
feedTypeStringBuffer.append(" ");
}
feedTypeString=feedTypeStringBuffer.toString();
/**
* java FileOutputStream写入文件时会覆盖原来内容么
* 看构造方法
* FileInputStream inOne=new FileInputStream(fileX);这种覆盖
* FileInputStream inOne=new FileInputStream(fileX,true);这种不覆盖
*/
//向文件中写入数据 这里采用覆盖写入方式
FileOutputStream fos = new FileOutputStream(filePath);
byte[] bytes = feedTypeString.getBytes();
fos.write(bytes);
fos.close();
}catch (Exception e){
e.printStackTrace();
}
}
}