IO與線程-文件存儲
Android手機中機身存儲空間ROM,按照功能進行劃分能分為以下三個區域
Paste_Image.png
- 系統分區下是Android系統內置的APP等內容,對普通用戶不可寫;程序分區是我們自己安裝的APP;公共存儲空間用于儲存我們平時下載的內容比如電影,音樂
- 普通應用開發無需涉及系統分區,我們先只關注程序分區
程序分區我們需要關注以下兩個區域
Paste_Image.png
- APK內置數據。對應到data/app/應用包名
- APK私有數據空間。對應到data/data/應用包名
對于儲存一些固定不變的使用頻率較高的內容,我們可以將其儲存在APK內置數據中,有以下兩個目錄可以選擇
Paste_Image.png
- res/raw/與assets/下的內容在編譯時都會被編譯進APK文件中
- 先來看res/raw/的讀取過程
InputStream in = context.getResources().openRawResources(R.raw.文件名);
res/raw/下的文件不能出現同名文件,否則出現編譯錯誤
且該文件夾下不能有子目錄 - assets/的讀取過程
InputStream in = context.getAssets().open(quot;文件在assets下的目錄/文件名.文件格式quot;);
- assets下的存儲優于raw下的存儲,其具備raw所有功能,且方便支持webView
webView.loadUrl(quot;file:///android_assets/html/about.htmlquot;);
對于儲存應用比較隱私的內容,我們應該使用APP私有數據空間進行存儲,這個目錄下面,我們應注意cache和files文件,分別對應應用的緩存和應用內文件
Paste_Image.png
- 先來關注files文件下的讀寫
FileInputStream in = context.openFileInput(String fileName);//讀
FileOutputStream out = context.openFileOutput(String fileName, int mode);//寫
這里的mode有兩種取值Context.PRIVATE和Context.APPEND,分別對應覆蓋和追加 - 再下來cache文件下的讀寫
File chcheDir = context.getCacheDir(); File cacheFile = new File(CacheDir.getAbsolutePath() quot;/fileNamequot;); FileOutPutStream out = null; out = new FileOutPutStream(cacheFile); String s = new String(quot;hello worldquot;); out.write(s.getBytes(quot;utf-8quot;)); out.close//寫 FileInPutStream in = new FileInPutStream(cacheFile); String ss = Util.getStringStream(in);//讀
cache目錄下儲存有一個特性是當系統儲存空間不足時會被自動清除,需要注意
最后來看公共存儲空間
- 首先使用公共存儲空間需要權限 WRITE_EXTERNAL_STORAGE
- 因為使用公共目錄,可能被其他APP訪問
-
公共存儲空間也有獨立的分類
這里關注的是 應用擴展存儲目錄 (scared/Android/data/包名,其下同樣包含應用的cache和files)
應用將數據存在這里,在APP被刪除時不會產生垃圾文件,且應用文件不會被媒體管理器掃描,相對隱秘
Paste_Image.png
獲取擴展存儲files目錄
使用Context.getExternalFilesDir(String type)
獲取擴展儲存cache目錄(這里的緩存同樣會在系統儲存空間不夠時被清空)
使用Contetx.getExternalCacheDir()
-
獲取公共存儲空間
使用Enviroment.getExternalStorageDirectory()
Tags: 安卓開發
文章來源:http://www.jianshu.com/p/9860bc11e066