Android中檔案的讀寫
阿新 • • 發佈:2018-12-15
首先得獲取檔案讀寫的許可權可以在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(); } } }