首先得获取文件读写的权限可以在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 List readTextFile(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();        }    }}

更多相关文章

  1. [Android 数据库] Android数据库总结
  2. Android数据存取之Databases
  3. 浅析Android线程模型
  4. Android 文件系统及权限修改
  5. Android下SQLite数据库编程学习系列之二---在Android下使用SQLit
  6. Android中对Log日志文件的分析
  7. 重新解压打包android 根文件系统 ramdisk.img
  8. Android XMl文件中tools前缀

随机推荐

  1. android 屏幕监听滑动事件
  2. Android Studio第一章Big task1 - Experi
  3. Android Wear Preview - UI
  4. Android的之我见
  5. android中的后退键——onBackPressed()的
  6. 使用android快速开发框架afinal 开发andr
  7. Android如何为kernel添加一个驱动
  8. android:process=":remote" .
  9. android学习日记01-搭配开发环境
  10. Android 各版本Gradle离线下载