1.Android文件的操作模式
在java中要想對文件做讀寫操作,只需創(chuàng)建 文件,讀寫數(shù)據(jù)即可,Android卻是不同,android基于Linux,在讀寫文件的時(shí)候,還需要加上文件的操作模式。
文件的操作模式:
MODE_PRIVATE:默認(rèn)的模式,代表該文件是私有數(shù)據(jù),只能被本應(yīng)用本身訪問,寫入的內(nèi)容會覆蓋原來的內(nèi)容
MODE_APPEND:會檢驗(yàn)文件是否存在,存在就追加內(nèi)容,不存在就創(chuàng)建。
MODE_WORLD_READABLE:當(dāng)前文件可以被其他應(yīng)用讀取
MODE_WORLD_WRITEABLE:當(dāng)前文件可以被其他應(yīng)用寫入
后面兩個(gè)是用于控制其他應(yīng)用是否有讀寫文件的權(quán)限的,
文件即可讀又可寫:
openFileOutput("java.text",Context.MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE);
2.文件的相關(guān)操作方法
openFileOutput(filename,mode):打開文件的輸出流,寫入數(shù)據(jù)
openFileInput(filename):打開文件的輸入流,讀取數(shù)據(jù)
getDir(name,mode):在app的Data目錄下面獲取或者創(chuàng)建name對應(yīng)的子文件
getFileDir():獲取app的Data目錄的file目錄的絕對路徑
String[]fileList():返回app的data目錄下的所有的文件的路徑
deleteFile(filename):刪除data目錄下指定文件
android有一套自己的安全模型,當(dāng)安裝apk的時(shí)候,系統(tǒng)會分配給它一個(gè)userid,當(dāng)該應(yīng)用要去訪問其他資源,比如文件,就要配對當(dāng)前的userid是否一致。任何app創(chuàng)建的文件,sp,數(shù)據(jù)庫,都是私有的,其他的程序無法訪問的,除非在創(chuàng)建時(shí)指定好MODE模式。才能正確的訪問到。
3.文件讀寫的實(shí)現(xiàn)
Android中的文件讀寫和Java中的文件I/O相同。
/*
* 這里定義的是一個(gè)文件保存的方法,寫入到文件中,所以是輸出流
* */
public void save(String filename, String filecontent) throws Exception {
//這里我們使用私有模式,創(chuàng)建出來的文件只能被本應(yīng)用訪問,還會覆蓋原文件哦
FileOutputStream output = mContext.openFileOutput(filename, Context.MODE_PRIVATE);
output.write(filecontent.getBytes()); //將String字符串以字節(jié)流的形式寫入到輸出流中
output.close(); //關(guān)閉輸出流
}
/*
* 這里定義的是文件讀取的方法
* */
public String read(String filename) throws IOException {
//打開文件輸入流
FileInputStream input = mContext.openFileInput(filename);
byte[] temp = new byte[1024];
StringBuilder sb = new StringBuilder("");
int len = 0;
//讀取文件內(nèi)容:
while ((len = input.read(temp)) > 0) {
sb.append(new String(temp, 0, len));
}
//關(guān)閉輸入流
input.close();
return sb.toString();
}
4.讀取SD卡上的文件
?
讀寫SD卡上面的文件:
當(dāng)我們使用context的OpenFileInput或者OpenFileOutput打開文件輸入,輸出流時(shí),程序打開的都是app的數(shù)據(jù)文件夾中的文件,data/data/<應(yīng)用包名>/file目錄下;如果存儲的數(shù)據(jù)過大就要考慮使用SD存儲。
?
SD卡的讀寫步驟:
1.首先判斷SD是否存在,且可讀寫。
Enveroment.getExternalStorageState().equals(Everoment.MEAD_MOUNTED)
2.獲取SD卡的外部目錄,同時(shí)獲得SD卡的路徑。
Enveroment.getExternalStorageDirectory().getCanonicalPath()
3.使用FileOutputStream,F(xiàn)ileInputStream或者FileReader,F(xiàn)ileWriter讀寫SD卡中文件。
4.在androidManifest添加SD卡權(quán)限。
?
//往SD卡寫入文件的方法
public void savaFileToSD(String filename, String filecontent) throws Exception {
//如果手機(jī)已插入sd卡,且app具有讀寫sd卡的權(quán)限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
//這里就不要用openFileOutput了,那個(gè)是往手機(jī)內(nèi)存中寫數(shù)據(jù)的
FileOutputStream output = new FileOutputStream(filename);
output.write(filecontent.getBytes());
//將String字符串以字節(jié)流的形式寫入到輸出流中
output.close();
//關(guān)閉輸出流
} else Toast.makeText(context, "SD卡不存在或者不可讀寫", Toast.LENGTH_SHORT).show();
}
//讀取SD卡中文件的方法
//定義讀取文件的方法:
public String readFromSD(String filename) throws IOException {
StringBuilder sb = new StringBuilder("");
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
//打開文件輸入流
FileInputStream input = new FileInputStream(filename);
byte[] temp = new byte[1024];
int len = 0;
//讀取文件內(nèi)容:
while ((len = input.read(temp)) > 0) {
sb.append(new String(temp, 0, len));
}
//關(guān)閉輸入流
input.close();
}
return sb.toString();
}
?
5.讀取raw和assets文件夾下的文件
?
res/raw
:文件會被映射到R.java文件中,訪問的時(shí)候直接通過資源ID即可訪問,而且 他不能有目錄結(jié)構(gòu),就是不能再創(chuàng)建文件夾
assets
:不會映射到R.java文件中,通過AssetManager來訪問,能有目錄結(jié)構(gòu),即, 可以自行創(chuàng)建文件夾
?
讀取文件資源:
res/raw:
InputStream is =getResources().openRawResource(R.raw.filename);
assets:
AssetManager am = getAssets(); InputStream is = am.open("filename");