一、Context.MODE_PRIVATE:爲默認操做模式,表明該文件時私有數據,只能被應用自己訪問,在該模式下,寫入的內容會覆蓋文件的內容,若是想把新寫入的內容追加到原文件中,可使用Context.,MODE_APPEND。 java
package org.example.service; android
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream; 數據庫
import android.content.Context; 數組
public class FileService {
/**
* (文件的IO技術)提供上下文對象
*/
private Context context;
/**
* 經過構造器給context賦值
*/
public FileService(Context context) {
this.context = context;
}
/**
* 保存文件
* @param filename 文件名稱
* @param content 文件內容
*/
public void save(String filename, String content) throws Exception {
/*
* 一、根據上下文對象能快速獲得一個文件輸出流對象;
* 二、私有操做模式:建立出來的文件只能被本應用訪問,其餘應用沒法訪問該文件:Context.MODE_PRIVATE;
* 另外採用私有操做模式建立的文件,寫入的內容會覆蓋原文件的內容。
* 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
* Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
*/
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_PRIVATE);
//把字符串傳化爲二進制數據寫入到文件中
outStream.write(content.getBytes());
//而後關掉這個流
outStream.close();
}
/**
* 讀取文件內容
* @param filename 文件名稱
* @return 文件內容
* @throws Exception
*/
public String read(String filename) throws Exception
{
/*
* 一、從上下文對象中獲得一個文件輸入流對像,context.openFileInput(filename)獲得文件輸入流對象;
* 二、
*/
FileInputStream inStream = context.openFileInput(filename);
//把每次讀到的數據都存放在內存中
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//定義數組大小
byte[] buffer = new byte[1024];
int len = 0;
//讀取這個輸入流數組,判斷數據是否讀完
while((len = inStream.read(buffer)) != -1)
{
outStream.write(buffer,0,len);
}
//從內存中獲取獲得的數據
byte[] data = outStream.toByteArray();
//轉化爲字符
return new String(data);
} 安全
} this
二、Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,不然就建立新文件。 .net
/**
* 使用追加模式保存文件
* @param filename
* @param content
* @throws Exception
*/
public void saveAppend(String filename, String content) throws Exception {
/*
* 一、根據上下文對象能快速獲得一個文件輸出流對象;
* 二、追加操做模式:建立出來的文件只能被本應用訪問,其餘應用沒法訪問該文件:Context.MODE_PRIVATE;
* 另外採用追加操做模式建立的文件,先會檢查文件是否存在,存在就往文件追加內容,不然就建立新文件。
* 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
* Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
*/
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_APPEND);
//把字符串傳化爲二進制數據寫入到文件中
outStream.write(content.getBytes());
//而後關掉這個流
outStream.close();
} 對象
三、Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其餘應用是否有權限讀寫該文件。 內存
1)MODE_WORLD_TEADABLE:表示當前文件能夠被其餘應用讀取。 資源
/**
* 使用READABLE建立文件
* @param filename
* @param content
* @throws Exception
*/
public void saveReadable(String filename, String content) throws Exception {
/*
* 一、根據上下文對象能快速獲得一個文件輸出流對象;
* 二、MODE_WORLD_TEADABLE:表示當前文件能夠被其餘應用讀取,建立的文件,寫入的內容會覆蓋原文件的內容。
* 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
* Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
*/
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_READABLE);
//把字符串傳化爲二進制數據寫入到文件中
outStream.write(content.getBytes());
//而後關掉這個流
outStream.close();
}
2)MODE_WORLD_WTITEABLE:表示當前文件能夠被其餘應用寫入,但不能讀取其數據。
/**
* 使用WRITEABLE建立文件
* @param filename
* @param content
* @throws Exception
*/
public void saveWriteable(String filename, String content) throws Exception {
/*
* 一、根據上下文對象能快速獲得一個文件輸出流對象;
* 二、MODE_WORLD_WRITEABLE:表示當前文件能夠被其餘應用寫入,建立的文件,寫入的內容會覆蓋原文件的內容。
* 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
* Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
*/
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_WRITEABLE);
//把字符串傳化爲二進制數據寫入到文件中
outStream.write(content.getBytes());
//而後關掉這個流
outStream.close();
}
四、若是但願文件被其餘應用讀和寫,能夠傳入:
openFileOutput("hello.txt",Context.MODE_WORLE_TEADABLE + Context.MODE_WOTLD_WRITEABLE);
/**
* 建立可以進行讀和寫的文件
* @param filename
* @param content
* @throws Exception
*/
public void saveRW(String filename, String content) throws Exception {
/*
* 一、根據上下文對象能快速獲得一個文件輸出流對象;
* 二、Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE:表示當前文件能夠被其餘應用讀寫和寫入,建立的文件,寫入的內容會覆蓋原文件的內容。
* 三、openFileOutput()方法的第一個參數用於指定文件名稱,不能包含路徑分隔符"/",若是文件不存在,
* Android會自動建立它,建立的文件保存在/data/data/<package name>/files目錄,如/data/data/org.example.files/files.
*/
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
//把字符串傳化爲二進制數據寫入到文件中
outStream.write(content.getBytes());
//而後關掉這個流
outStream.close();
}
五、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("hello.txt");
Log.i("FileTest".readInStream(inStream));
或者直接使用文件的絕對路徑:
File file = new File("/data/data//data/data/org.example.files/files.txt");
FileInputStream inStream = new FileInputStream(file);
Log.i("FileTest".readInStream(inStream));
注意:上面文件路徑中"org.example.files"爲應用所在包,當你在編寫代碼時應替換爲你本身應用使用的包。
對於私有文件只能被建立該文件的應用訪問,若是但願文件能被其餘應用讀和寫,能夠在建立文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WRITEABLE權限。
Activity還提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用於獲取/data/data/<package name>/cache目錄
getFilesDir()方法用於獲取/data/data/<package name>/files目錄