轉(zhuǎn)載請注明出處:http://www.reibang.com/p/21b266d6b6d7
之前說了下Android中Sharedpreferences、SQLite Databases的使用一疯,不太會這兩個的可以參考這兩篇文章:
[Android 數(shù)據(jù)存儲 (一)SharedPreferences]乒裆、
[Android 數(shù)據(jù)存儲 (三)SQLite Databases]初嘹。
這篇主要說一下文件存儲(內(nèi)部存儲和外部存儲)意述。
1 Internal Storage
Internal Storage:內(nèi)部存儲器。
我們可以直接將文件保存在設(shè)備的內(nèi)部存儲設(shè)備上。默認情況下城舞,保存到內(nèi)部存儲的文件對您的應(yīng)用程序是私有的,其他應(yīng)用程序無法訪問它們(用戶也不可以)忙灼。當用戶卸載您的應(yīng)用程序時匠襟,這些文件將被刪除。
創(chuàng)建和寫入私有文件到內(nèi)部存儲
String content = "abcdefghigk";
try {
FileOutputStream os = openFileOutput("internal.txt", MODE_PRIVATE);
//寫數(shù)據(jù)
os.write(content.getBytes());
os.close();//關(guān)閉文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
- 調(diào)用openFileOutput()该园,參數(shù):文件的名稱和操作模式酸舍。這返回一個FileOutputStream。該方式創(chuàng)建的文件路徑為:/data/data/<包名>/files/目錄下里初。
- write()將字符串寫入文件啃勉。
- close()關(guān)閉輸出流。
文件操作模式有以下四種:
- MODE_PRIVATE 將創(chuàng)建文件(或替換相同名稱的文件)双妨,并使其對您的應(yīng)用程序是私有的淮阐。
- MODE_APPEND 如果文件已經(jīng)存在,則將數(shù)據(jù)寫入現(xiàn)有文件的末尾刁品,而不是將其刪除泣特。
- MODE_WORLD_READABLE 可讀(不建議)
- MODE_WORLD_WRITEABLE 可寫(不建議)
從內(nèi)部存儲讀取文件
byte buffer[] = new byte[4096];
try {
FileInputStream in = openFileInput("internal.txt");
//將數(shù)據(jù)讀到buffer.
int len = in.read(buffer);
in.close();//關(guān)閉文件
Log.i(TAG, "buffer="+new String(buffer,0,len));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
- 調(diào)用openFileInput()并傳遞要讀取的文件的名稱。這返回一個FileInputStream挑随。
- 從文件中讀取字節(jié)read()状您。
- 然后關(guān)閉流 close()。
如果要在編譯時保存應(yīng)用程序中的靜態(tài)文件兜挨,請將該文件保存在項目res/raw/目錄中膏孟。您可以打開它 openRawResource(),傳遞資源ID(R.raw.<filename>)拌汇。此方法返回一個 可用于讀取文件(但不能寫入原始文件)的 InputStream實例柒桑。
保存緩存文件
如果您想緩存一些數(shù)據(jù),而不是持久存儲担猛,那么您應(yīng)該使用它getCacheDir()來打開File代表應(yīng)用程序應(yīng)該保存臨時緩存文件的內(nèi)部目錄幕垦。
當設(shè)備的內(nèi)部存儲空間不足時,Android可能會刪除這些緩存文件以恢復空間傅联。但是先改,您不應(yīng)該依靠系統(tǒng)來清理這些文件。您應(yīng)該始終自己維護緩存文件蒸走,并保持在合理的空間上限仇奶,例如1MB。當用戶卸載您的應(yīng)用程序時,這些文件將被刪除该溯。
其他有用的方法
- getFilesDir()
獲取保存內(nèi)部文件的文件系統(tǒng)目錄的絕對路徑岛抄。 - getDir()
在內(nèi)部存儲空間內(nèi)創(chuàng)建(或打開現(xiàn)有的)目錄。 - deleteFile()
刪除保存在內(nèi)部存儲上的文件狈茉。 - fileList()
返回應(yīng)用程序當前保存的文件數(shù)組夫椭。
2 External Storage
每個Android兼容設(shè)備都支持一個共享的“外部存儲”,您可以使用它來保存文件氯庆。這可以是可移動存儲介質(zhì)(例如SD卡)或內(nèi)部(不可移動)存儲蹭秋。保存到外部存儲器的文件是可讀的,用戶可以在使用USB大容量存儲在計算機上傳輸文件時進行修改堤撵。
注意:如果用戶將外部存儲器安裝在計算機上或刪除了介質(zhì)仁讨,則外部存儲可能會變得不可用,并且您保存到外部存儲器的文件沒有執(zhí)行安全性实昨。所有應(yīng)用程序都可以讀取和寫入放在外部存儲上的文件洞豁,用戶可以將其刪除。
訪問外部存儲
為了在外部存儲上讀取或?qū)懭胛募母膽?yīng)用程序必須獲取 <font color =blue>READ_EXTERNAL_STORAGE </font>或<font color =blue>WRITE_EXTERNAL_STORAGE</font>系統(tǒng)權(quán)限丈挟。例如:
<uses-permission android:name = “android.permission.READ_EXTERNAL_STORAGE” />
<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE” />
如果您需要讀取和寫入文件,則需要僅請求 WRITE_EXTERNAL_STORAGE權(quán)限志电,因為它隱含地還需要讀取訪問權(quán)限礁哄。
注意:從Android 4.4開始,如果您正在閱讀或僅寫入您的應(yīng)用程序的私有文件溪北,則不需要這些權(quán)限桐绒。
檢查媒體可用性
在對外部存儲進行任何處理之前,應(yīng)始終調(diào)用getExternalStorageState()以檢查介質(zhì)是否可用之拨。介質(zhì)可能安裝到計算機茉继,丟失,只讀或處于某種其他狀態(tài)蚀乔。這里有幾種可用于檢查可用性的方法:
/* 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;
}
該getExternalStorageState()方法返回您可能想要檢查的其他狀態(tài)烁竭,如媒體是否被共享(連接到計算機),完全丟失吉挣,已被刪除等等派撕。您可以使用這些來通知用戶更多信息您的應(yīng)用程序需要訪問媒體。
保存可與其他應(yīng)用共享的文件
從媒體掃描器隱藏您的文件
通常睬魂,用戶可以通過應(yīng)用程序獲取的新文件應(yīng)該保存到其他應(yīng)用可以訪問的設(shè)備上的“公共”位置终吼,用戶可以輕松地從設(shè)備中復制它們。這樣做時氯哮,你應(yīng)該使用的共享的公共目錄际跪,如之一Music/,Pictures/和Ringtones/。
為了得到一個File較合適的公共目錄姆打,呼叫g(shù)etExternalStoragePublicDirectory()良姆,通過它你想要的目錄的類型,如 DIRECTORY_MUSIC幔戏,DIRECTORY_PICTURES玛追, DIRECTORY_RINGTONES,或其他闲延。通過將文件保存到相應(yīng)的媒體類型目錄豹缀,系統(tǒng)的媒體掃描器可以對系統(tǒng)中的文件進行適當?shù)姆诸悾ɡ纾徛曉谙到y(tǒng)設(shè)置中顯示為鈴聲慨代,而不是音樂)。
例如啸如,以下是在公共圖片目錄中為新相冊創(chuàng)建目錄的方法:
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;
}
保存專用的文件
如果您正在處理不適用于其他應(yīng)用程序的文件(例如只有您的應(yīng)用程序使用的圖形紋理或聲音效果)侍匙,則應(yīng)通過調(diào)用在外部存儲上使用專用存儲目錄getExternalFilesDir()。此方法還需要一個type參數(shù)來指定子目錄的類型(如DIRECTORY_MOVIES)叮雳。如果您不需要特定的媒體目錄想暗,請傳遞null以接收您應(yīng)用的私有目錄的根目錄。
從Android 4.4開始帘不,在應(yīng)用程序的私有目錄中讀取或?qū)懭胛募恍枰猂EAD_EXTERNAL_STORAGE 或WRITE_EXTERNAL_STORAGE 權(quán)限说莫。因此,您可以通過添加maxSdkVersion 屬性來聲明只能在較低版本的Android上請求權(quán)限:
<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE” android:maxSdkVersion = “18” />
注意: 當用戶卸載您的應(yīng)用程序時寞焙,此目錄及其所有內(nèi)容將被刪除储狭。此外,系統(tǒng)介質(zhì)掃描程序不會讀取這些目錄中的文件捣郊,因此它們無法從MediaStore內(nèi)容提供程序訪問辽狈。因此,您不應(yīng)將這些目錄用于最終屬于用戶的媒體呛牲,例如您的應(yīng)用程序捕獲或編輯的照片刮萌,或用戶使用您的應(yīng)用購買的音樂 - 這些文件應(yīng)保存在公共目錄中。
保存緩存文件
打開一個File,該File代表您應(yīng)該保存緩存文件的外部存儲目錄娘扩,請調(diào)用getExternalCacheDir()着茸。如果用戶卸載您的應(yīng)用程序,這些文件將被自動刪除琐旁。
提示: 要保留文件空間并保持應(yīng)用程序的性能涮阔,請務(wù)必仔細管理緩存文件,并在整個應(yīng)用程序的生命周期中刪除不再需要的緩存文件灰殴。
歡迎大家關(guān)注澎语、評論、點贊。
你們的支持是我堅持的動力擅羞。