Android數據存儲之File

Android使用與其餘平臺相似的基於磁盤文件系統(disk-based file systems),上篇文章經過SharedPerference來進行數據存儲,此次可使用File。File 對象很是適合用來讀寫那種流式順序的數據,能夠用來讀寫圖片文件或者是網絡中交換的數據。html

存儲位置

全部的Android設備都有兩個文件存儲區域:"internal" 與 "external" 存儲。 那兩個名稱來自與早先的Android系統中,那個時候大多數的設備都內置了不可變的內存(internal storage),而後再加上一個相似SD card(external storage)這樣能夠卸載的存儲部件。後來有一些設備把"internal" 與 "external" 的部分都作成不可卸載的內置存儲了,雖然如此,可是這一整塊仍是從邏輯上有被劃分。java

Internal storage:老是可用的;這裏的文件默認是隻能被本身的app所訪問的;當用戶卸載app的時候,系統會把internal裏面的相關文件都清除乾淨;Internal是在你想確保不被用戶與其餘app所訪問的最佳存儲區域。android

External storage:並不老是可用的,由於用戶能夠選擇把這部分做爲USB存儲模式,這樣就不能夠訪問了;是你們均可以訪問的,所以保存到這裏的文件是失去訪問控制權限的;當用戶卸載你的app時,系統僅僅會刪除external根目錄(getExternalFilesDir)下的相關文件;External是在你不須要嚴格的訪問權限而且你但願這些文件可以被其餘app所共享或者是容許用戶經過電腦訪問時的最佳存儲區域。緩存

Internal storage保存

保存到手機的internal的時候,須要兩種方法去取出文件目錄:網絡

getFilesDir() : 返回一個File,表明app的internal目錄。app

getCacheDir() : 返回一個File,表明了app的internal緩存目錄。須要確保這個目錄下的文件在一旦再也不須要的時候可以立刻被刪除,還要分配一個合理的大小,例如1MB 。若是系統的內部存儲空間不夠,會自行選擇刪除緩存文件。this

下面這種方式直接經過openFileOutput,在對應的路徑下建立一個文件:google

	 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()方法:spa

	 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:htm

    <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 block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.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")
相關文章
相關標籤/搜索