內(nèi)部存儲(chǔ)與外部存儲(chǔ)
內(nèi)部存儲(chǔ)
用戶無(wú)法在手機(jī)文件夾訪問(wèn)的目錄 /data,此目錄下常用的有(不同rom會(huì)有差異)
/data/app用于保存已安裝應(yīng)用的apk文件;
/data/data保存已安裝應(yīng)用的app信息;
/data/data/package name保存具體應(yīng)用下的信息(如SharePreferences、DataBase等),當(dāng)app卸載時(shí),此目錄及其以下文件全部刪除。
外部存儲(chǔ)
用戶通過(guò)手機(jī)文件夾訪問(wèn)的目錄,如DCIM相冊(cè)文件夾,Download下載文件的位置
外部存儲(chǔ)包含出廠時(shí)自帶的存儲(chǔ),也包含sdcard。
外部存儲(chǔ)(除External獲取的)的數(shù)據(jù)與app無(wú)關(guān)聯(lián)性,知道具體路徑便可訪問(wèn)。因此app創(chuàng)建的文件夾無(wú)法在app卸載時(shí)被刪除。長(zhǎng)此以往,除用戶主動(dòng)刪除,外存的空間會(huì)逐漸減少。
獲取
1、getCacheDir() ----> /data/data/package name/cache/
2、getFilesDir() ----> /data/data/package name/files/
3、getExternalCacheDir() ----> 外部存儲(chǔ)路徑/Android/data/package name/cache/
4、getExternalFilesDir() ----> 外部存儲(chǔ)路徑/Android/data/package name/files/
5、getExternalStorageDirectory() ----> 非scared路徑的外部存儲(chǔ)路徑
1、2、3、4跟隨app的包名創(chuàng)建的目錄,清除緩存或卸載會(huì)將數(shù)據(jù)清除
1、2、3、4不需要申請(qǐng)權(quán)限,
3、4、5需要判斷是否存在外置SD(以前需要判斷scared是否已插入,但隨著發(fā)展android機(jī)基本都掛有外部存儲(chǔ))
5、需要自己手動(dòng)維護(hù)文件結(jié)構(gòu)
6.0之后動(dòng)態(tài)申請(qǐng)的權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
文件操作
避免重復(fù)造輪子,取其我認(rèn)為需要記錄的內(nèi)容
Java和Android文件操作
File(File dir, String name)
File(String path)
File(String dirPath, String name)
File(URI uri)
這些構(gòu)造方法的實(shí)質(zhì)都是一樣的,就是構(gòu)造一個(gè)File實(shí)例,必須提供一個(gè)完整的文件路徑。
構(gòu)造了一個(gè)File實(shí)例,并不是說(shuō)就新建了一個(gè)文件或文件夾,這個(gè)File實(shí)例,只是實(shí)際系統(tǒng)內(nèi)文件實(shí)體的一個(gè)代表。
重要方法:public boolean exists() 判斷文件或文件夾是否存在
public boolean isFile() 判斷是否為文件
public boolean isDirectory 判斷是否為文件夾
public boolean createNewFile() 根據(jù)制定的路徑和文件名創(chuàng)建一個(gè)新的,空的文件
public boolean mkdir() 根據(jù)制定的路徑創(chuàng)建文件夾 (一級(jí)操作)
public boolean mkdirs() 根據(jù)制定的路徑創(chuàng)建文件夾 (多級(jí)操作)
public boolean delete() 刪除文件或文件夾
public boolean renameTo(File dest) 重命名文件或文件夾
public long length() 獲得文件的長(zhǎng)度,單位為 byte(文件夾不可用)
public String getName() 獲得文件或文件夾的名字
public String getAbsolutePath() 獲得文件或文件夾的絕對(duì)路徑
pubic String getPath() 獲得文件或文件夾的路徑
public File[] listFiles() 返回文件夾內(nèi)所有的File 對(duì)象
public String[] list() 返回文件夾內(nèi)所有的文件或文件夾的名字
讀寫(xiě)操作
Context已經(jīng)實(shí)現(xiàn)了快捷方法:
public FileInputStream openFileInput(String name)
public FileOutputStream openFileOutput(String name, int mode)
查看源碼會(huì)得知文件在getFilesDir()目錄下。
模式:
私有模式
1、只能被創(chuàng)建這個(gè)文件的當(dāng)前應(yīng)用訪問(wèn)
2、若文件不存在會(huì)創(chuàng)建文件;若創(chuàng)建的文件已存在則會(huì)覆蓋掉原來(lái)的文件
Context.MODE_PRIVATE = 0x0000;追加模式
1、私有的
2、若文件不存在會(huì)創(chuàng)建文件;若文件存在則在文件的末尾進(jìn)行追加內(nèi)容
Context.MODE_APPEND = 0x8000;可讀模式
1、創(chuàng)建出來(lái)的文件可以被其他應(yīng)用所讀取
Context.MODE_WORLD_READABLE=0x0001;可寫(xiě)模式
1、允許其他應(yīng)用對(duì)其進(jìn)行寫(xiě)入。
Context.MODE_WORLD_WRITEABLE=0x0002;
以上文件操作模式均針對(duì)保存在手機(jī)自帶存儲(chǔ)空間的文件。若文件存儲(chǔ)在SDCard上,則不受讀寫(xiě)控制。
流
讀寫(xiě)操作中有FileInputStream、FileOutputStream兩個(gè)流,但實(shí)際java中的流有兩類(lèi)。

字節(jié)流:讀取的數(shù)據(jù)以字節(jié)為單位(byte),8bit
字符流:讀取的數(shù)據(jù)以字符為單位(char),16bit