標籤:android style blog http io os ar 使用 java
Android使用與其他平台類似的基於磁碟檔案系統(disk-based file systems),上篇文章通過SharedPerference來進行資料存放區,這次可以使用File。File 對象非常適合用來讀寫那種流式順序的資料,可以用來讀寫圖片檔案或者是網路中交換的資料。
儲存位置
所有的Android裝置都有兩個檔案儲存體地區:"internal" 與 "external" 儲存。 那兩個名稱來自與早先的Android系統中,那個時候大多數的裝置都內建了不可變的記憶體(internal storage),然後再加上一個類似SD card(external storage)這樣可以卸載的儲存組件。後來有一些裝置把"internal" 與 "external" 的部分都做成不可卸載的內建儲存了,雖然如此,但是這一整塊還是從邏輯上有被劃分。
Internal storage:總是可用的;這裡的檔案預設是只能被自己的app所訪問的;當使用者卸載app的時候,系統會把internal裡面的相關檔案都清除乾淨;Internal是在你想確保不被使用者與其他app所訪問的最佳儲存地區。
External storage:並不總是可用的,因為使用者可以選擇把這部分作為USB儲存模式,這樣就不可以訪問了;是大家都可以訪問的,因此儲存到這裡的檔案是失去存取控制許可權的;當使用者卸載你的app時,系統僅僅會刪除external根目錄(getExternalFilesDir)下的相關檔案;External是在你不需要嚴格的存取權限並且你希望這些檔案能夠被其他app所共用或者是允許使用者通過電腦訪問時的最佳儲存地區。
Internal storage儲存
儲存到手機的internal的時候,需要兩種方法去取出檔案目錄:
getFilesDir() : 返回一個File,代表app的internal目錄。
getCacheDir() : 返回一個File,代表了app的internal緩衝目錄。需要確保這個目錄下的檔案在一旦不再需要的時候能夠馬上被刪除,還要分配一個合理的大小,例如1MB 。如果系統的內部儲存空間不夠,會自行選擇刪除快取檔案。
下面這種方式直接通過openFileOutput,在對應的路徑下建立一個檔案:
String filename ="testfile"; String string = "FlyElephant!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }
當然如果你想儲存一些快取檔案的時候,就需要調用一下系統的getCacheDir()方法:
File file; try { String fileName="CacheTest"; file = File.createTempFile(fileName, ".txt", MainActivity.this.getCacheDir()); } catch (IOException e) { // Error while creating file }External storage儲存
剛才儲存到Internal中的時候什麼都沒有配置,需要儲存到外部的時候需要配置讀寫的許可權,讀的許可權READ_EXTERNAL_STORAGE,寫的許可權:READ_EXTERNAL_STORAGE:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
先來看一段儲存到外部儲存的代碼:
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File file = new File(Environment.getExternalStorageDirectory(),"66.txt");try {FileOutputStream fos = new FileOutputStream(file);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject("FlyElephant");// 寫入fos.close(); // 關閉輸出資料流} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}Log.i("com.example.googlefile", file.getAbsolutePath());
首先需要判斷一下SD卡是不是可用,因為external storage可能是停用比如SD卡被拔出,那麼你應該在訪問之前去檢查是否可用。你可以通過執行 getExternalStorageState()來查詢external storage的狀態。如果返回的狀態是MEDIA_MOUNTED, 那麼你可以讀寫。(開始沒有判斷的時候,一直沒有找到報錯的原因)
看到這個擷取完之後跟上面儲存在內部存放裝置的過程一樣,下面就不用多說什麼了,最後一點就是路徑是在/mnt/sdcard目錄下,如果是弄成私人檔案,不允許外部存取,目錄應該是在
/mnt/sdcard/Android/data/包名 目錄下。
檔案儲存體比較簡單,另外說下檔案刪除吧,儲存到外部:
file.Delete()
Internal中的刪除:
MainActivity.this.deleteFile("testfile")
Android資料存放區之File