Context提供2個方法打開應用程序的數(shù)據(jù)文件夾里的文件IO流悬蔽。
- FileInputStream openFileInput(String name) 輸入數(shù)據(jù)到name文件中
2)FileOutputStream openFileOutput(String name,int mode) 以mode模式獲得文件輸出流(輸出數(shù)據(jù)到name文件中)
mode:
MODE_PRIVATE:私有(當前應用程序)覆蓋模式;
MODE_APPEND:私有捉兴、追加模式蝎困;
MODE_WORLD_READABLE:公有、只讀模式
MODE_WORLD_WRITEABLE:公有倍啥、可寫模式
注意禾乘,如果希望其他使得文件模式疊加,則可以使用加號連接虽缕;
比如:
Context.MODE_WORLD_READABLE **+ **Context.MODE_WORLD_WRITEABLE
表示其他應用讀寫始藕;
文件存儲簡單的來說就是一般的JAVASE中的IO流,只是把他應用于Android手機中而已彼宠;
創(chuàng)建的文件保存在/data/data/<package name>/files目錄
創(chuàng)建文件與刪除文件
- File file = new File("文件的保存路徑")
- 刪除文件 file.delete();
File file = new File("mnt/sdcard/test")
if(!file.exisits()){
file.createNewFile();
}else{
Toast.makeText(MainActivity.this,"此文件已經存在",1).show();
}
file.delete();
要拋出異常鳄虱!
得到當前應用程序默認的數(shù)據(jù)存儲目錄
File file=this.getFileDir(); //----- /data/data/cn.xxx.xxx(當前包)/files ```
######得到當前應用程序默認的緩存文件的存放位置
File file=this.getCacheDir(); //----- /data/data/cn.xxx.xxx(當前包)/cache```
可以把一些不是非常重要的文件在此處創(chuàng)建使用凭峡,
如果手機的內存不足的時候拙已,系統(tǒng)會自動去刪除APP的cache目錄的數(shù)據(jù)
得到外部的存儲位置
File file=this.getExternalFileDir();
File file=this.getExternalCacheDir();
方法同上
舉個栗子:
一個EditText(etWrite)用于寫入數(shù)據(jù)
一個TextView(tvRead)用于讀取數(shù)據(jù)
兩個Button一個用于保存saveButton
摧冀,一個用于讀取readButton
public void onClick(View v) {
switch(v.getId()){
case R.id.saveButton:
String writeContext=etWrite.getText().toString();
try{
FileOutputStream fos=this.openFileOutput("文件名"倍踪,MODE_PRIVATE);//此時如果文件不存在系宫,系統(tǒng)會自動幫你在默認目錄下創(chuàng)建
fos.write(writeContext.getBytes());
}catch(Exception e){
e.printStackTrace();
}finally{
try {
fos.close(); //建議把close方法放到finally中
} catch (Exception e) {
e.printStackTrace();
}
}
}
case R.id.readButton:
String content=null;
try{
FileInputStream fis =this.openFileInput("文件名");//獲得輸入流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];//每次讀取1024個字節(jié)
int len=0;
while(len=fis.read(buffer)!=-1){
baos.write(buffer,0,len);
}
content=baos.toString();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
fis.close();
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
將文件保存到SDCard
如果一個文件很大,則不適用于存放在手機的存儲中建车;
如果手機存在sdcard扩借,則sdcard的目錄為/mnt/sdcard目錄;
在AndroidManifest.xml中設置:
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<application.../> ```
**存儲到sdcard核心代碼**:
File f = new File(Environment.getExternalStorageDirectory(),filename);
out = new FileOutputStream(f,true);
out.write(filecontent.getBytes("UTF-8")); ```
讀取sdcard核心代碼:
File f = new File(Environment.getExternalStorageDirectory(),filename);
in = new FileInputStream(f);
while((length=in.read(buf))!=-1){
bout.write(buf,0,length);
}
byte[] content = bout.toByteArray(); ```
其實主要就是存儲目錄問題缤至;
注意:
在Android中1.5潮罪、1.6的sdcard目錄為/sdcard,而Android2.0以上都是/mnt/sdcard领斥,因此如果我們在保存時直接寫具體目錄會不妥嫉到,因此我們可以使用:
**Environment.getExternalStorageDirectory();**獲取sdcard目錄;
建議:
(1)不能純粹使用sdcard保存法月洛,因為如果不能判定一部手機是否存在sdcard何恶,如果沒有,則需要提供其他解決方法嚼黔,比如
保存到手機存儲细层;
提示不存在sdcard;
可以使用:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//執(zhí)行存儲sdcard方法
}
else{
//存儲到手機中唬涧,或提示
}
當應用程序在安裝時系統(tǒng)就會分配給他一個userid疫赎,當該應用要去訪問其他資源比如文件的時候,就需要userid匹配碎节。默認情況下虚缎,任何應用創(chuàng)建的文件,sharedPreferences钓株,數(shù)據(jù)庫都應該是私有的(位于/data/data/<package name>/files)实牡,其他程序無法訪問。除非是在創(chuàng)建時制定了MODE_WORLD_READABLE或者MODE_WORLD_WRITEABLE