1. 程式人生 > >Android中檔案的讀寫

Android中檔案的讀寫

首先得獲取檔案讀寫的許可權可以在AndroidManifest中進行獲取檔案讀寫實驗

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

其實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執行緒上釋出結果,而無需操作執行緒和/或處理程式。

 允許對使用者介面執行非同步操作。 它會先阻塞工作執行緒中的操作,然後在 UI 執行緒中釋出結果,而無需您親自處理執行緒和/或處理程式。

使用:

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();
        }



    }
}