在android開發中檔案操作使用的其實還是比較高頻的,之前我遇到這種需求都隨便寫寫,對此沒有乙個比較全面的認識,所以想借這篇文章來梳理一遍。
由於需要讀寫檔案,這包含了讀寫外部sd card的檔案,所以需要新增對飲的讀寫許可權
1、獲取儲存路徑android可能有兩個地方可以儲存檔案,一是存放在sd卡中(如果有的話),另外就是儲存在記憶體卡中,那麼與此對應的就有兩組方法來獲取儲存路徑。
a、獲取sd卡相關路徑的方法
關於獲取sd卡相關路徑方法和獲取到的路徑的對應關係如下
environment.getexternalstoragedirectory().getabsolutepath()
/storage/emulated/0
environment.getexternalstoragepublicdirectory(environment.directory_dcim).getabsolutepath())
/storage/emulated/0/dcim
這兩個方法是通過environment提供的方法來獲取sd卡路徑,可以看到的獲取的基本是sd卡的根路徑,而實際上/storage/emulated/0這個路徑代表是的第一行sd卡,當我們在該路徑下建立yoryky.txt檔案時,實際手機上看到的路徑是/儲存盤/yoryky.txt,根本是找不到/storage/emulated/0這個路徑的。
另外我們還可以根據context物件提供的方法來獲取sd卡的儲存路徑
getexternalcachedir().getabsolutepath()
/storage/emulated/0/android/data/packagename/cache
getexternalfilesdir(environment.directory_pictures).getabsolutepath:
/storage/emulated/0/android/data/packagename/files/pictures
這個路徑是在上面講到cache目錄的同級目錄下建立乙個files目錄,並在其中闖將存放的pictures目錄。getexternalfilesdir方法中可以傳多種引數,例如還可以傳environment.directory_dcim這個引數一遍在files目錄下建立dcim這個目錄。
由此我們知道獲取sd卡路徑的方法有兩套,一套是通過environment類獲取packagename無關的路徑,一套是通過context類獲取packagename相關的路徑,packagename路徑下可以有cache和files兩個目錄。
這裡的cache以及files兩個目錄在手機中的路徑為/儲存盤/sd/android/data/packagename/中。
b、獲取記憶體卡相關路徑方法
和獲取sd卡路徑不同,獲取記憶體卡路徑不能通過environment類來獲取,只能通過context來獲取
getcachedir().getabsolutepath()
/data/user/0/packagename/cache
getfilesdir().getabsolutepath()
/data/user/0/com.yoryky.demo/files
可以看出context提供的兩個方法,乙個用來獲取cache目錄路徑,乙個用來獲取files目錄路徑。這個的/data/user/0/代表多使用者(android 4.2版本開始支援多使用者)中的第乙個使用者的儲存路徑,這個在手機上也是找不到的,實際上cache和files在手機中的路徑如下
看的出來,手機上cache和files的實際路徑為/儲存盤/android/data/packagename/。
2、讀寫sd card路徑中檔案
第一小節講了獲取sd卡目錄路徑以及記憶體卡目錄路徑的方法,這裡先來說說讀寫sd卡路徑中檔案的方法實現
a、寫sd卡中的檔案方法
這裡通過fileoutputstream類來實現寫sd卡檔案
/**
* 將內容寫入sd卡中
* @param filename 要寫入的檔名
* @param content 待寫入的內容
* @throws ioexception
*/public static void writeexternal(context context, string filename, string content) throws ioexception
}
這個**很簡單,而且注釋也很詳細,這裡就不解釋了。
b、讀sd卡中的檔案方法
通過fileinputstream來獲取sd卡中對應檔案的內容
/**
* 從sd card檔案中讀取資料
* @param filename 待讀取的sd card
* @return
* @throws ioexception
*/public static string readexternal(context context, string filename) throws ioexception
//關閉輸入流
inputstream.close();
}return sb.tostring();
}
通過fileinputstream物件遍歷便可以獲取對應檔案中的內容。
3、讀寫記憶體卡中的檔案
其實續寫記憶體卡中的檔案方法和讀寫sd卡檔案方法基本一致,就是檔案路徑改變了而已。
a、寫記憶體卡中檔案方法
這裡也直接給出實現
/**
* 寫internal card檔案
* @param context
* @param filename
* @param content
* @throws ioexception
*/public static void writeinternal(context context, string filename, string content) throws ioexception
這裡還是通過fileoutputstream類來寫資料到檔案中。
b、讀記憶體卡中檔案方法
還是直接給**
/**
* 讀記憶體卡中檔案方法
* @param context
* @param filename 檔名
* @return
* @throws ioexception
*/public static string readinternal(context context,string filename) throws ioexception
//關閉輸入流
inputstream.close();
return sb.tostring();
}
這裡依然通過fileinputstream來獲取檔案中的資料。
到這裡讀寫sd卡以及記憶體卡中的檔案方法就算是寫完了,實際上有這四個方法,我麼就可以封裝乙個自己的fileutil類來專門處理檔案的讀寫操作了。這裡還是給乙個demo位址吧,android demo.
4、參考文獻
1、android常見檔案路徑介紹
2、android讀寫檔案
3、android sd卡簡單的檔案讀寫操作
4、android 檔案的讀取和寫入
這幾個參考文獻可好好看看,特別是前兩篇,第一篇說清楚了sd卡和記憶體卡路徑的作用和獲取方式,而第二篇說清了android中其它檔案的獲取方式寶座資源檔案以及assets中的檔案獲取方式。
android 檔案讀寫操作
android檔案操作 test in main string filename data data com.example.fileoperation files test.txt string str this is for test string readfiledata filename w...
Android中檔案的讀寫操作
一 讀取assets目錄下的檔案 try catch ioexception e 二 讀取raw目錄下的檔案 try catch ioexception e 三 讀取手機儲存檔案 內建 try catch filenotfoundexception e catch unsupportedencodi...
Android中檔案的讀寫操作
一 讀取assets目錄下的檔案 try catch ioexception e 二 讀取raw目錄下的檔案 try catch ioexception e 三 讀取手機儲存檔案 內建 try catch filenotfoundexception e catch unsupportedencodi...