存儲Files
Android的File系統和其他平臺上基於硬盤的File系統一樣,Android官方文檔表情,File適用於讀取不能中斷的大量數據。例如從網絡上獲取的數據(圖片文件)
所有的Android設備都有2個存儲空間,內部空間(internal)和外部空間(external),因爲android早期系統的關係,不管怎麼說,android的設備都具有2個存儲空間,即外部空間和內部空間。
1.內部空間的特點:
a.它總是可訪問的.(並且不需要任何權限聲明)
b.默認情況下存儲在此的File只能由你的app訪問,其他訪問不了,保存文件的時候可以申請讓其他軟件可訪問。
c.當用戶刪除了該應用,這些文件會被自動刪除。
2.外部空間的特點:
a.並不是總是可訪問的。
b.你保存的文件可能會被外部訪問。
c.只有當你把文件存儲到
getExternalFilesDir()
.獲取的路徑下,應用卸載時纔會自動刪除該目錄下的文件。否則不會自動刪除應用中的文件。注意:儘管應用會默認的安裝在內部空間中,但是你可以通過指定
android:installLocation 屬性值將你的app安裝到外部空間中。
一般應用佔用的空間較大 可以通過此屬性將文件 移動到外部空間中去。
A.對於外部存儲設備擁有權限
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
如果只有讀的操作可以只聲明 <manifest ...>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
</manifest>
寫操作權限默認包含讀操作的權限,你不需要爲了內部空間的讀寫操作聲明任何權限,因爲這是默認就有的。
B.存儲到內部空間
1.調用getFileDir()方法。
2.調用getCacheDir()方法
。注意:這只是個臨時的存儲空間,當文件不需要的時候應該手動刪除,而且
應該限制該文件夾下的存儲容量。最好不要超過這上限值。例如設置上限值爲1MB。
以免當系統內存過低時,該文件下的內容會被沒有提示的情況
下被刪除。
你可以通過
File file = new File(context.getFilesDir(), filename);
指定自己的內部文件目錄,獲取
你可以通過
openFileOutput()
to
get a 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()。例如: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;
}
創建一個指定的文件名的文件在你的內部緩存目錄下。內部存儲空間的目錄名是你的app的包名。如果將文件的模式設置爲writeable或者
readable那麼其他的app就可以通過 具體的文件路徑訪問你的文件了,如果設置成
MODE_PRIVATE
,將不能訪問你的文件。 C.存儲到外部空間
因爲外部空間不總是可獲取的,所以我們使用前應該先判斷其他狀態,可以通
1.public
dir:該目錄下面的文件不會隨着app的卸載而消亡,其他的app也可訪問。
用getExternalStoragePublicDirectory() 獲取public
dir.
2.private
dir:當應用被卸載該目錄下的文件也會刪除。
用getExternalFilesDir()獲取private
dir. 用系統提供的常量如:DIRECTORY_RINGTONES獲取文件
會被當做系統文件處理。
d.獲取空閒的大小。
可以使用getFreeSize(),或者getTotalSize()獲取可用的大小,和總大小。
如果不清楚大小,也可以通過捕捉IO。Exceltion異常來判斷。
e.刪除文件
可以通過file.delte()刪除文件。
如果文件是存儲在內部空間中,可以使用Context對象的 deleteFile(String name)方法
myContext.deleteFile(fileName);
來刪除文件。
最好請注意:
當app被卸載時,有2部分的內容可能被自動清除。
1.內部空間的內容
2.外部空間位於getExternalFilesDir()目錄下的內容。
還有就是請定期手動的刪除用getCacheDir()創建的文件和定期刪除其他已經不再需要的文件。