Android資料存放區之File

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.