2016-05-27 62 views
1

我在應用程序中有一些可下載的內容(例如遊戲角色圖像),在iOS中它們被保存到路徑NSCachesDirectory,我遵循iOS的準則,可下載內容應該保存在NSCachesDirectory(緩存目錄)中。如果我應該將文件保存到android端的getCacheDir(),我掙扎。android(getCacheDir())中的緩存文件夾在功能上等同於iOS中的緩存文件夾(NSCachesDirectory)嗎?

起初我覺得在iOS上的緩存文件夾應該等於(或類似)的一個android的,但看一些文檔後,如果他們的功能相同,我懷疑:

1.iOS提出了一些可下載內容保存在緩存文件夾中,這樣的內容更加堅持tmp中的臨時文件。但在android中,文檔說getCacheDir()應該存儲緩存文件而不是持久文件,這讓我懷疑android緩存文件夾的工作方式與iOS中的tmp文件夾更像是相似的

2.我在iOS緩存中找不到任何大小限制指南文件,但android方面表示它應該有合理的大小限制,比如1 MB(我認爲我的內容將遠遠超過1 MB,比如說50到100 MB)。

所以我的問題是,iOS緩存文件夾的作品在功能上等同於android中的緩存文件夾?在iOS端使用NSCachesDirectory的地方在android端使用getCacheDir()是否正確?如果不是,當我在iOS端使用NSCachesDirectory時應該在android端使用哪個路徑?

回答

3

不,iOS緩存文件夾不起作用在功能上等同於在Android中緩存 文件夾。

有關Android的所有數據存儲選項的更多詳細信息,請參閱official docs here

在用於存儲大量數據的Android中,您可以使用內部或外部數據存儲選項。如果需要,也可以在內部或外部數據存儲選項上使數據保密。

內部存儲

每個應用程序都有自己的私人內部存儲來保存文件。如果用戶不能從應用程序外部修改文件,並且其他應用程序不應該能夠訪問這些文件,則使用這種存儲。由於內部存儲器是您的應用程序專用的,因此如果您的應用程序被卸載,這些文件將被刪除。內部存儲也是默認安裝應用程序的地方,因此您的文件將始終可用。在一些較舊或較便宜的設備上,內部存儲器非常有限,因此如果需要支持這些設備,則需要小心保存的數據大小。

您不應該硬編碼到存儲目錄的路徑,因爲目錄可能會根據所使用的Android操作系統的版本而變化。此外,Android 4.4引入了多用戶的概念:在這種情況下,內部和外部存儲取決於用戶登錄,其他用戶的文件將不可見。下面是一些用於獲取的路徑到內部存儲器中的方法:

  • android.content.Context.getFilesDir():返回表示內部的根目錄中的對象的java.io.File存儲您的應用程序從當前的上下文。

  • android.content。Context.getDir(String name,Context.MODE_PRIVATE):返回一個java.io.File對象,表示內部存儲器中的目錄名稱,如果該目錄不存在,則創建該目錄。第二個參數也可用於將目錄設置爲MODE_WORLD_READABLE或MODE_WORLD_WRITABLE,以便所有其他應用程序都可以看到該目錄,但這樣做在安全性方面存在風險,並且在API級別17(Android 4.2)中不推薦使用。

  • android.content.Context.getCacheDir():返回表示應用程序的內部緩存目錄的java.io.File對象。這對於小文件(文檔建議不要超過1MB)可以在系統需要更多存儲空間時隨時刪除。無法保證緩存將被清除,因此您必須在不再需要時手動清除這些文件。

正如你可以看到,這些文件從java.io namepace File對象表示:有具體到Android SDK和標準Java API沒有文件對象讀取和寫入文件使用。此外,Android清單中沒有設置特定的應用程序權限來使用內部存儲,因爲它對於應用程序來說已經是私有的。

外部存儲

此外內部存儲的,存在通過當應用程序卸載時候被保持在所有應用程序共享外部存儲空間。這是使用文件資源管理器應用程序時以及設備插入計算機時顯示的存儲空間。它可以被實現爲可以被移除的SD卡或作爲設備中內置存儲的分區,因此即使卡被移除或更改,您的應用程序也應該能夠工作。要檢查外部存儲的當前狀態,可以調用getExternalStorageState()方法。

對於有許多用戶的設備(從Android 4.4開始),外部存儲器是特定於當前用戶的,其他用戶的文件不能被訪問。另外,如果設備具有作爲內部存儲器和SD卡上的分區的內置外部存儲器,則可能存在多個外部存儲器:在這種情況下,內置存儲器是主要外部存儲器。從外部存儲讀取文件需要READ_EXTERNAL_STORAGE權限,寫入或讀取文件需要WRITE_EXTERNAL_STORAGE權限。

下面是你應該使用調用來獲得主要外部存儲的目錄的方法:

  • android.os.Environment.getExternalStorageDirectory():返回的java.io.File對象,代表所有應用程序共享的設備主外部存儲器的根目錄。
  • android.os.Environment.getExternalStoragePublicDirectory():返回一個java.io.File對象,該對象表示設備的主外部存儲上的特定類型文件的公用目錄。例如,通過調用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),可以調用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)或公共圖片目錄來獲取公共音樂目錄的路徑。
  • android.content.Context.getExternalFilesDir():返回表示特定於應用程序的主外部存儲,它是()由getExternalStorageDirectory返回的目錄下的根目錄下的的java.io.File。與外部存儲的其他目錄不同,當您的應用程序被卸載時,您存儲在該文件夾中的文件將被刪除。所以,如果你需要存儲只有你的應用程序需要的文件,你應該使用這個文件夾。此外,從Android 4.4開始,應用程序無需讀取或寫入其自己的外部存儲器所需的特定權限,但對於舊版本,您的應用程序需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE權限。
  • android.content.Context.getExternalFilesDirs():返回一個java.io.File數組,表示您的應用程序可以使用主外部存儲作爲第一個目錄的所有外部存儲目錄的根目錄在數組中。所有這些目錄與getExternalFilesDir()方法返回的主存儲器的作用相同。如果設備具有作爲主外部存儲器的內置存儲器和作爲輔助外部存儲器的SD卡,則這是獲取SD卡路徑的唯一方法。此方法在Android 4.4中引入,之前無法獲取輔助存儲的路徑。
  • android.content.Context.getExternalCacheDir():返回表示主外部存儲上的應用程序緩存的java.io.File對象。此緩存對用戶不可見,並在卸載應用程序時被刪除。 Android SDK中沒有機制來刪除緩存目錄中的文件,因此您需要管理緩存以將其保持在合理的最大大小。從Android 4.4開始,應用程序不需要訪問自己的緩存的權限,但對於舊版本,應用程序需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE權限。
+0

有關android文件系統的最佳解釋。謝謝 – netsmertia

相關問題