Android中文件的读写

首先得获取文件读写的权限可以在AndroidManifest中进行获取文件读写实验

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

对于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<Void,Void,Boolean> {

        //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<String> readTextFile(String filePath){
        List<String> 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<String> 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();
        }



    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值