Android中對/data/data//files下檔案的讀寫操作
本文重點展示,對/data/data/<package name>/files中檔案的讀寫操作的實現。
一、寫出資料到files資料夾中,Activity提供了openFileOutput()方法,可以把資料輸出到/data/data/<package name>/files的資料夾中。
- publicclass FileActivity extends Activity {
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- ...
-
FileOutputStream outStream = this
- Context.MODE_PRIVATE);
- outStream.write("測試".getBytes());
- outStream.close();
- }
- }
第一個引數:指定檔名稱,不能包含路徑分隔符“/” ,如果檔案不存在,Android 自動建立它。儲存在/data/data/<package name>/files目錄中,如: /data/data/cn.%%.action/files/ceshi.txt 。
第二引數用於指定操作模式,有四種模式,分別為:
- Context.MODE_PRIVATE
- Context.MODE_APPEND
- Context.MODE_WORLD_READABLE
- Context.MODE_WORLD_WRITEABLE
可以同時傳入一種以上的模式如:
- openFileOutput("ceshi.txt", Context.MODE_WORLD_READABLE + Context.MODE_
- WORLD_WRITEABLE);
二、讀取 /data/data/<package name>/files/ceshi.txt中的資料。直接上程式碼:
- FileInputStream inStream = context.openFileInput(ceshi.txt);//只需傳檔名
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();//
- 輸出到記憶體
- int len=0;
- byte[] buffer = newbyte[1024];
- while((len=inStream.read(buffer))!=-1){
- outStream.write(buffer, 0, len);//
- }
- byte[] content_byte = outStream.toByteArray();
- String content = new String(content_byte);
- system.out.println(content)
總結:重點注意的地方就是openFileOutput()的第一個引數和openFileInput()的引數,不需要寫絕對路徑,只需寫檔名就可以了!
附言:當然讀取資料時也可以用絕對路徑,沒有本文所述的方便,比如讀取檔案時可以用:
- Context context=MainActivity.this;//首先,在Activity裡獲取context
- File file=context.getFilesDir();
- String path=file.getAbsolutePath();
- System.out.println(path);
- File file = new File(path+ceshi.txt);
- FileInputStream inStream = new FileInputStream(file);//需傳路徑: /data/data/cn.itheima.rw_file/files/ceshi.txt
context.openFileInput("ceshi.txt");
補充:
首先給大家介紹使用檔案如何對資料進行儲存,Activity提供了openFileOutput()方法可以用於把資料輸出到檔案中,具體的實現過程與在J2SE環境中儲存資料到檔案中是一樣的。
public class FileActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
...
FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE);
outStream.write("傳智播客".getBytes());
outStream.close();
}
}
openFileOutput()方法的第一引數用於指定檔名稱,不能包含路徑分隔符“/”,如果檔案不存在,會自動建立它。建立的檔案儲存在/data/data/<package name>/files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,通過點選Eclipse選單“Window”-“Show View”-“Other”,在對話視窗中展開android資料夾,選擇下面的File Explorer檢視,然後在File Explorer檢視中展開/data/data/<package name>/files目錄就可以看到該檔案。
openFileOutput()方法的第二引數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔案。
MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入。
如果希望檔案被其他應用讀和寫,可以傳入:
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如檔案的時候,就需要userid匹配。預設情況下,任何應用建立的檔案,sharedpreferences,資料庫都應該是私有的(位於/data/data/<package name>/files),其他程式無法訪問。除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程式才能正確訪問。
如果要開啟存放在/data/data/<package name>/files目錄應用私有的檔案,可以使用Activity提供openFileInput()方法。
FileInputStream inStream = this.getContext().openFileInput("itcast.txt");
Log.i("FileTest", readInStream(inStream));
readInStream()的方法請看本頁下面備註。
或者直接使用檔案的絕對路徑:
File file = new File("/data/data/cn.itcast.action/files/itcast.txt");
FileInputStream inStream = new FileInputStream(file);
Log.i("FileTest", readInStream(inStream));
注意:上面檔案路徑中的“cn.itcast.action”為應用所在包,當你在編寫程式碼時應替換為你自己應用使用的包。
對於私有檔案只能被建立該檔案的應用訪問,如果希望檔案能被其他應用讀和寫,可以在建立檔案時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE許可權。
Activity還提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用於獲取/data/data/<package name>/cache目錄
getFilesDir()方法用於獲取/data/data/<package name>/files目錄