android File的知識點一網打盡。

                                               存儲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也可訪問。


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()創建的文件和定期刪除其他已經不再需要的文件。


       





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章