❶ android數據存儲之File總結
在使用File存儲App數據時,我們需要了解Android系統的存儲系統。Android的存儲分為內部存儲和外部存儲。
由於Android系統的廠商比較多,對於外部存儲目錄的定義有所不同,可能在根目錄下的mnt,sdcard和storage下。以storage為例,打開emulated/0目錄,外部存儲目錄就出現了。雖然可以通過多種路徑打開外部存儲文件,但是最終他們的路徑是相同的:
mnt:
storage:
sdcard:
外部存儲目錄下包含兩大類:公有目錄和私有目錄
私有目錄:
對比下來External有以下幾點優點:
缺點:
內部存儲與外部存儲許可權申請對比如下:
首先我們要獲取外部存儲目標文件的路徑:
然後確定自己需要創建的文件名,結合上面的到的路徑,創建一個File對象:
Android系統默認數據清理的路徑是,內部存儲目錄中相應的cache文件夾中的文件和外部存儲中相應的cache文件夾中的文件。
你的app的internal storage 目錄是以你的app的包名作為標識存放在Android文件系統的特定目錄下[data/data/com.example.xx]。 從技術上講,如果你設置文件為可讀的,那麼其他app就可以讀取你的internal文件。然而,其他app需要知道你的包名與文件名。若是你沒有設置為可讀或者可寫,其他app是沒有辦法讀寫的。因此只要你使用MODE_PRIVATE ,那麼這些文件就不可能被其他app所訪問。
另外記住一點,內部存儲在你的APP卸載的時候,會一塊被刪除,因此,我們可以在cache目錄裡面放置我們的圖片緩存,而且cache與files的差別在於,如果手機的內部存儲空間不夠了,會自行選擇cache目錄進行刪除,因此,不要把重要的文件放在cache文件裡面,可以放置在files裡面,因為這個文件只有在APP被卸載的時候才會被刪除。還有要注意的一點是,如果應用程序是更新操作,內部存儲不會被刪除,區別於被用戶手動卸載。
不管你是使用 () 來存儲可以共享的文件,還是使用 getExternalFilesDir() 來儲存那些對於你的app來說是私有的文件,有一點很重要,那就是你要使用那些類似DIRECTORY_PICTURES 的API的常量。那些目錄類型參數可以確保那些文件被系統正確的對待。例如,那些以DIRECTORY_RINGTONES 類型保存的文件就會被系統的media scanner認為是ringtone而不是音樂。
在開發中,不建議往內部存儲中寫太多的數據,畢竟空間有限。外部存儲在使用的時候最好能夠將文件存放在私有目錄下,這樣有利於系統維護,也避免用戶的反感。
徹底理解android中的內部存儲與外部存儲
Android存儲挖坑記
緩存文件可以放在哪裡?它們各自的特點是什麼
❷ android怎樣拿到file的路徑
Environment 常用方法:
* 方法:getDataDirectory()
解釋:返回 File ,獲取 Android
數據目錄。
* 方法:getDownloadCacheDirectory()
解釋:返回 File ,獲取 Android
下載/緩存內容目錄。
* 方法:getExternalStorageDirectory()
解釋:返回 File ,獲取外部存儲目錄即
SDCard
* 方法:(String type)
解釋:返回 File
,取一個高端的公用的外部存儲器目錄來擺放某些類型的文件
* 方法:getExternalStorageState()
解釋:返回 File
,獲取外部存儲設備的當前狀態
* 方法:getRootDirectory()
解釋:返回 File ,獲取 Android 的根目錄
file的getPath getAbsolutePath和getCanonicalPath的不同
File的這三個方法在api中都有說明,僅以程序為例說明。
package test;
import
java.io.File;
import java.io.IOException;
public class TestFilePath
{
public static void main(String[] args) {
// TODO Auto-generated
methodstub
System.out.println(System.getProperty("user.dir"));
try
{
System.out.println("-----默認相對路徑:取得路徑不同------");
File file1 =new
File("..\\src\\test1.txt");
System.out.println(file1.getPath());
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getCanonicalPath());
System.out.println("-----默認相對路徑:取得路徑不同------");
File
file =new
File(".\\test1.txt");
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
System.out.println("-----默認絕對路徑:取得路徑相同------");
File
file2 =new
File("D:\\workspace\\test\\test1.txt");
System.out.println(file2.getPath());
System.out.println(file2.getAbsolutePath());
System.out.println(file2.getCanonicalPath());
}
catch (IOException e) {
// TODOAuto-generated catch
block
e.printStackTrace();
}
}
}
程序執行結果如下:
F:\eclipseworkspace\testejb
-----默認相對路徑:取得路徑不同------
..\src\test1.txt
F:\eclipseworkspace\testejb\..\src\test1.txt
F:\eclipseworkspace\src\test1.txt
-----默認相對路徑:取得路徑不同------
.\test1.txt
F:\eclipseworkspace\testejb\.\test1.txt
F:\eclipseworkspace\testejb\test1.txt
-----默認絕對路徑:取得路徑相同------
D:\workspace\test\test1.txt
D:\workspace\test\test1.txt
D:\workspace\test\test1.txt
結論:
當輸入為絕對路徑時,返回的都是絕對路徑。
當輸入為相對路徑時:
getPath()返回的是File構造方法里的路徑,是什麼就是什麼,不增不減
getAbsolutePath()返回的其實是user.dir+getPath()的內容,從上面F:\eclipseworkspace\testejb、F:\eclipseworkspace\testejb\..\src\test1.txt、F:\eclipseworkspace\testejb\.\test1.txt可以得出。
getCanonicalPath()返回的就是標準的將符號完全解析的路徑
public String
getAbsolutePath()返回抽象路徑名的絕對路徑名字元串。
如果此抽象路徑名已經是絕對路徑名,則返回該路徑名字元串,這與 getPath()
方法一樣。如果此抽象路徑名是空的抽象路徑名,則返回當前用戶目錄的路徑名字元串,該目錄由系統屬性 user.dir
指定。否則,使用與系統有關的方式分析此路徑名。在 UNIX 系統上,通過根據當前用戶目錄分析某一相對路徑名,可使該路徑名成為絕對路徑名。在 Microsoft
Windows
系統上,通過由路徑名指定的當前驅動器目錄(如果有)來分析某一相對路徑名,可使該路徑名成為絕對路徑名;否則,可以根據當前用戶目錄來分析它。
返回:
絕對路徑名字元串,它與此抽象路徑名表示相同的文件或目錄的
拋出:
SecurityException
- 如果無法訪問所需的系統屬性值。
另請參見:
isAbsolute()
public String getCanonicalPath()
throws
IOException返回抽象路徑名的規范路徑名字元串。
規范路徑名是絕對路徑名,並且是惟一的。規范路徑名的准確定義與系統有關。如有必要,此方法首先將路徑名轉換成絕對路徑名,這與調用
getAbsolutePath() 方法的效果一樣,然後用與系統相關的方式將它映射到其惟一路徑名。這通常涉及到從路徑名中移除多餘的名稱(比如 "." 和
"..")、分析符號連接(對於 UNIX 平台),以及將驅動器名轉換成標准大小寫形式(對於 Microsoft Windows
平台)。
表示現有文件或目錄的每個路徑名都有一個惟一的規范形式。表示非存在文件或目錄的每個路徑名也有一個惟一的規范形式。非存在文件或目錄路徑名的規范形式可能不同於創建文件或目錄之後同一路徑名的規范形式。同樣,現有文件或目錄路徑名的規范形式可能不同於刪除文件或目錄之後同一路徑名的規范形式。
返回:
表示與此抽象路徑名相同的文件或目錄的規范路徑名字元串
拋出:
IOException
- 如果發生 I/O 錯誤(可能是因為構造規范路徑名需要進行文件系統查詢)
SecurityException -
如果無法訪問所需的系統屬性值,或者存在安全管理器,且其 SecurityManager.checkRead(java.io.FileDescriptor)
方法拒絕對該文件進行讀取訪問
從以下版本開始:
JDK1.1