Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 保存鍵值集

保存鍵值集

編輯:關於Android編程

共享偏好文件命名時,你應該使用一個名稱標識的應用程序,如“com.example.myapp.PREFERENCE_FILE_KEY”

警告:如果你創建一個共享MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE首選項文件,然後任何其他應用程序知道文件標識符可以訪問您的數據。

警告:如果你創建一個共享MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE首選項文件,然後任何其他應用程序知道文件標識符可以訪問您的數據。

從共享首選項文件中檢索值,調用方法如getInt()和getString(),提供你想要的價值的關鍵,選擇返回默認值,如果不存在的關鍵。例如:

保存文件

Android使用的文件系統類似於其他平台上的基於磁盤的文件系統。本課程介紹如何使用Android文件系統讀取和寫入文件的文件api。

一個文件對象是適合閱讀或寫作大量數據提供順序沒有跳過。例如,它對圖像文件或任何通過網絡交換。

這節課展示了如何執行基本與文件相關的任務應用程序。這個教訓假定您熟悉基本的Linux文件系統和標准文件輸入/輸出在io api。

選擇內部或外部存儲

所有的Android設備有兩個文件存儲區域:“內部”和“外部”存儲。這些名字來自Android的早期,當大多數設備提供了內置的非易失性存儲器(內存),加上一個可移動的存儲介質,如微型SD卡(外部存儲器)。一些設備將永久存儲空間劃分為“內部”和“外部”分區,所以即使沒有一個可移動的存儲介質,總有兩種存儲空間和API行為是相同的外部存儲是否r emovable與否。以下列表總結關於每個存儲空間的事實。

內部存儲:

它總是可用的。

文件保存在默認情況下只可以訪問應用程序。

當用戶卸載你的應用時,系統會刪除所有你的應用從內部存儲的文件。

內部存儲最好當你想確保無論是用戶還是其他應用程序可以訪問你的文件

外部存儲:

這並不總是可用,因為用戶可以安裝外部存儲USB存儲和在某些情況下將它從設備。

這是公開的,所以文件保存在這裡可能會讀你的控制之外。

當用戶卸載應用程序,系統刪除應用程序的文件從這裡只有如果你拯救他們的目錄從getExternalFilesDir()。

外部存儲器的最好的地方是不需要的文件訪問限制,你想與其他應用程序共享的文件或允許用戶訪問計算機。

提示:盡管應用程序安裝到內部存儲在默認情況下,您可以指定android:installLocation屬性在你顯化你的應用程序可以安裝在外部存儲器。用戶欣賞這個選項當APK文件大小是非常大的,他們有一個外部比內部存儲器的存儲空間。有關更多信息,請參見應用安裝位置。

獲得外部存儲權限

寫外部存儲,你必須請求WRITE_EXTERNAL_STORAGE許可清單文件:

注意:目前,所有應用程序可以讀取外部存儲沒有特別許可。然而,這將改變在將來發布的版本中。如果您的應用程序需要讀取外部存儲器(但不寫),那麼您將需要申報READ_EXTERNAL_STORAGE許可。確保應用程序繼續正常工作,你現在應該宣布這個許可,在更改生效。

然而,如果您的應用程序使用WRITE_EXTERNAL_STORAGE許可,那麼它隱式權限讀取外部存儲器。

你不需要任何權限保存在內部存儲的文件。應用程序總是讀和寫文件的權限在其內部存儲目錄。

在內部存儲器保存一個文件

當一個文件保存到內部存儲,您可以獲得適當的目錄作為一個文件通過調用兩種方法之一:

getFilesDir()

返回一個文件代表內部目錄為您的應用程序。

getCacheDir()

返回一個文件代表內部目錄app的臨時緩存文件。一定要刪除每個文件一旦不再需要和實現一個合理的大小限制的內存使用在任何給定的時間,比如1 mb。如果系統開始運行低存儲、刪除緩存文件沒有警告。

在一個目錄中創建一個新文件,您可以使用文件()構造函數,通過上述方法之一提供的文件,指定您的內部存儲目錄。例如:

 

File file = new File(context.getFilesDir(), filename);

 

或者,你可以叫openFileOutput()獲得FileOutputStream寫入一個文件在你的內部目錄中。例如,下面是如何編寫一些文本文件:

 

String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;

try {
 outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
 outputStream.write(string.getBytes());
 outputStream.close();
} catch (Exception e) {
 e.printStackTrace();
}

 

或者,如果您需要緩存一些文件,你應該使用createTempFile()。例如,下面的方法提取文件的名字從一個URL並創建一個文件,這個名字在你的應用程序的內部緩存目錄:

 

public File getTempFile(Context context, String url) {
  File file;
  try {
    String fileName = Uri.parse(url).getLastPathSegment();
    file = File.createTempFile(fileName, null, context.getCacheDir());
  catch (IOException e) {
    // Error while creating file
  }
  return file;
}
注意:您的應用程序的內部存儲目錄是由應用程序指定包名的安卓系統文件系統的一個特殊的位置。從技術上講,另一個應用程序可以讀取你的內部文件如果你設置的文件模式可讀。然而,其他應用程序也需要知道應用程序包名和文件名。其他應用程序不能浏覽你的內部目錄和沒有讀或寫訪問,除非您顯式地設置文件讀取或寫入。只要你使用MODE_PRIVATE內部存儲你的文件,他們從來沒有訪問其他應用程序。

 

 

保存一個文件在外部存儲器

因為外部存儲器可能unavailable-such當用戶安裝電腦的存儲或刪除提供外部的SD卡存儲空間之前應該確認體積可以訪問它。你可以查詢通過調用外部存儲狀態getExternalStorageState()。如果返回的狀態等於MEDIA_MOUNTED,然後你可以讀和寫你的文件。例如,下面的方法來確定存儲可用性是有用的:

 

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
  String state = Environment.getExternalStorageState();
  if (Environment.MEDIA_MOUNTED.equals(state)) {
    return true;
  }
  return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
  String state = Environment.getExternalStorageState();

 if (Environment.MEDIA_MOUNTED.equals(state) ||
    Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    return true;
  }
  return false;
}

     

雖然外部存儲修改的由用戶和其他應用程序,這裡有兩個類別的文件你可能保存:

公共文件

文件應該免費提供給其他應用程序和用戶。當用戶卸載應用程序時,這些文件應該保持用戶可用。

例如,照片被應用程序或其他下載文件。

私人的文件

文件本來就是屬於你的應用時,應刪除用戶卸載應用程序。盡管這些文件在技術上可由用戶和其他應用程序,因為他們是在外部存儲,它們實際的文件不提供價值給用戶以外的應用程序。當用戶卸載你的應用時,系統將刪除所有文件在您的應用程序的外部私人目錄。

例如,額外的應用程序下載的資源或臨時的媒體文件。

如果你想保存公共文件在外部存儲,使用getExternalStoragePublicDirectory()方法來獲取外部存儲上的文件代表相應的目錄。方法接受一個參數指定類型的文件你想保存,這樣他們可以在邏輯上組織與其他公共文件,如DIRECTORY_MUSIC或DIRECTORY_PICTURES。例如:

     
public File getAlbumStorageDir(String albumName) {
  // Get the directory for the user's public pictures directory. 
  File file = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), albumName);
  if (!file.mkdirs()) {
    Log.e(LOG_TAG, "Directory not created");
  }
  return file;
}

如果你想保存文件到您的應用程序而言是私有的,您可以獲得適當的目錄通過調用getExternalFilesDir()和傳遞給它一個名稱顯示目錄你喜歡的類型。這種方式創建的每個目錄添加到父目錄,封裝了所有應用程序的外部存儲文件,系統刪除當用戶卸載應用程序。

例如,這裡有一個方法可以用來創建一個目錄的個人相冊:

     
public File getAlbumStorageDir(Context context, String albumName) {
  // Get the directory for the app's private pictures directory. 
  File file = new File(context.getExternalFilesDir(
      Environment.DIRECTORY_PICTURES), albumName);
  if (!file.mkdirs()) {
    Log.e(LOG_TAG, "Directory not created");
  }
  return file;
}

   

如果沒有一個預先定義的子目錄名字適合你的文件,你可以叫getExternalFilesDir()和傳遞null。這將返回您的應用程序的根目錄的私人在外部存儲目錄。

記住getExternalFilesDir()創建一個目錄下的目錄,當用戶刪除卸載應用程序。如果你保存的文件應該保持可用用戶卸載之後你的應用(比如應用程序是一個攝像頭,用戶會想保持照片你應該使用getExternalStoragePublicDirectory()。

無論您使用getExternalStoragePublicDirectory()文件共享或getExternalFilesDir()的文件到你的應用程序而言是私有的,重要的是你使用API提供的目錄名像DIRECTORY_PICTURES常量。這些目錄名稱確保文件系統適當的治療。例如,文件保存在DIRECTORY_RINGTONES系統分類的媒體掃描儀代替音樂鈴聲。

 

查詢空閒空間

如果你知道提前多少數據你保存,你可以找到足夠的空間是否可用不會造成一個IOException通過調用getFreeSpace()或getTotalSpace()。這些方法提供當前可用的空間和總空間存儲卷,分別。這些信息也是有用的,以避免填充儲存容量超過一定阈值。

然而,系統不保證你可以寫盡可能多的字節由getFreeSpace表示()。如果返回幾MB數量超過你想保存的數據的大小,或者文件系統還不到90%,那麼它可能是安全的。否則,你可能不能寫入存儲。

注意:您不需要檢查的可用空間在你保存你的文件。你可以試著寫文件,然後抓住一個IOException如果發生。你可能需要這樣做,如果你不知道你需要多少空間。例如,如果你改變文件的編碼保存之前將PNG圖像轉換成JPEG,事先你不知道文件的大小。

刪除一個文件

      你應該刪除不再需要的文件。刪除一個文件的最直接的方法是打開文件的引用調用delete()。

 

 

myFile.delete();
如果文件是保存在內部存儲,你也可以問下定位和刪除一個文件通過調用

 

 

myContext.deleteFile(fileName);
   

注意:當用戶卸載應用程序,Android系統刪除以下:

你保存在內部存儲的所有文件

所有文件保存在外部存儲使用getExternalFilesDir()。

然而,您應該手動刪除所有緩存文件創建getCacheDir定期(),還定期刪除不再需要的其他文件。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved