Android中文件的读写
16lz
2021-01-23
首先得获取文件读写的权限可以在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){ List feedTypeList = 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,List feedTypeList){ 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(); } }}
更多相关文章
- [Android 数据库] Android数据库总结
- Android数据存取之Databases
- 浅析Android线程模型
- Android 文件系统及权限修改
- Android下SQLite数据库编程学习系列之二---在Android下使用SQLit
- Android中对Log日志文件的分析
- 重新解压打包android 根文件系统 ramdisk.img
- Android XMl文件中tools前缀