在Android中,所創建的用於保存數據的文件可以位於兩個位置:設備本身的存儲空間中,或是外接的存儲設備中(SD卡)。無論存儲在哪個位置,在默認的情況下,該文件都是不能夠供不同的應用程序共享的。文件放在不同位置,它們的讀取方式也有一些不同。
下面分別介紹如何將文件存儲在設備本身的存儲空間中以及外接的存儲設備中。
一、將文件存儲在設備本身的存儲空間中
通常來說,“存儲在設備本身”一般指的是在機身內存目錄data/data/工程包名/files下,這個文件夾稱爲私有文件夾,下面介紹的方法是系統默認在該目錄下對文件進行操作。機身內存的其它目錄是不建議操作的,因爲這會帶來許多管理上的問題。
在Android中,可以使用Context類提供的以下兩個方法來創建存儲對象:
(1)public abstract FileInputStream openFileInput(String name);//打開文件輸入流
(2)public abstract FileOutStream openFileOutput(String name, int mode);//打開文件輸出流
上面這兩個方法,都已經將工作目錄指向了機身內存目錄data/data/工程包名/files這個文件夾。注意,想要操作這個文件夾的文件,只能通過以上兩種方法實現!
其中,openFileInput()方法表示打開文件輸入流,用於從文件中讀取數據;openFileOutput()方法表示打開文件輸出流,用於向文件中寫入內容。
此外,openFileOutput()方法中的第二個參數mode用於指定文件的操作模式,其可選值有以下4種:
(1)Context.MODE_APPEND;//內容追加模式。在該模式下,系統會檢查文件是否存在,如果存在,則將內容追加到文件的末尾,如果文件不存在,則創建該文件並寫入內容。
(2)Context.MODE_PRIVATE;//默認操作模式。在該模式下,文件作爲私有數據,只能被該應用程序本身訪問。並且,在該模式下,寫入的內容會覆蓋原文件的內容。
(3)Context.MODE_WORLD_READABLE;//可讀模式。在該模式下,別的應用程序可以讀取該文件內容。
(4)Context.MODE_WORLD_WRITEABLE;//可寫模式。在該模式下,別的應用程序可以將內容寫入該文件。
1、存儲文件
一個簡單的存儲文件的例子如下:
public void saveContentToLocal(String fileNmae, String content) throws IOException {
FileOutputStream fileOutputStream = mContext.openFileOutput(fileNmae, Context.MODE_APPEND);
fileOutputStream.write(content.getBytes());
if(fileOutputStream != null) {
fileOutputStream.close();
}
}
以上的代碼,通過將openFileOutput()的第二個參數設定爲MODE_APPEND,指定了以內容追加模式存儲文件,文件名爲fileName,內容爲content。
2、讀取文件
那麼又該如何在程序中讀取該文件呢?下面的代碼給出了一種實現方案。
public void getFileFromLocal(String fileNmae) throws IOException {
FileInputStream fileInputStream = this.openFileInput(fileNmae);
int len = 0;
byte[] data = new byte[1024];
while((len = fileInputStream.read(data)) != -1) {
}
if(fileInputStream != null) {
//關閉FileInputStream對象
fileInputStream.close();
}
}
二、將文件存儲在外接存儲設備中(SD卡)
通常,手機的內存是極其有限的,更普遍的做法是將文件存儲到SD卡中。
將文件存儲在外接存儲設備中的方法和將文件存儲在設備本身的存儲空間中的方法類似,另外,我們習慣在操作SD卡前對其檢查,以確保運作不出錯。同時,這裏介紹用RandomAccessFile方法操作數據,這種方法更爲方便。
1、檢測SD卡的狀態
在Android中,檢測SD卡的狀態需要使用到Environment類。通過使用該類的getExternalStorageState()方法可以獲得外接存儲設備(SD卡)的狀態。其中,外接存儲設備的狀態有九種,具體如圖所示。
SD狀態 | 現象描述 |
MEDIA_MOUNTED | SD卡正常掛載 |
MEDIA_REMOVED | 無介質 |
MEDIA_UNMOUNTED | 有介質,未掛載,在系統中刪除 |
MEDIA_BAD_REMOVAL | 介質在掛載前被移除,直接取出SD卡 |
MEDIA_CHECKING | 正在磁盤檢查,剛裝上SD卡時 |
MEDIA_SHARED | SD卡存在但沒有掛載,並且通過USB大容量存儲共享,操作打開USB存儲 |
MEDIA_MOUNTED_READ_ONLY | sd卡存在並且已掛載,但是掛載方式爲只讀 |
MEDIA_NOFS | 介質存在但是爲空白或用在不支持的文件系統 |
MEDIA_UNMOUNTABLE | 存在SD卡但是不能掛載,例如發生在介質損壞 |
通過上表可以看出,只有在SD卡狀態爲MEDIA_MOUNTED時/mnt/sdcard目錄纔是可讀可寫,並且可以創建目錄及文件。
判斷很簡單,用 if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) 就可以了。
2、存儲文件
存儲文件到SD卡中的一個簡單例子如下:
public void rand(String fileNmae, String content) throws IOException {
//Environment.getExternalStorageDirectory(),獲取SD卡根目錄,也就是/mnt/sdcard
File fi = new File(Environment.getExternalStorageDirectory(),fileNmae);
RandomAccessFile ra = new RandomAccessFile(fi, "rw");
//指針移到頭部
ra.seek(0);
ra.writeChars(content);
//記得關閉
ra.close();
}
3、讀取文件
public void getrand(String fileNmae) throws IOException {
File fi = new File(Environment.getExternalStorageDirectory(),fileNmae);
RandomAccessFile ra = new RandomAccessFile(fi, "r");
ra.seek(0);
char ch=ra.readChar();
ra.close();
}
有一點需要說明,因爲程序中用到讀寫SD卡,所以需要在AndroidManifest.xml文件中加入向SD卡中寫入數據的權限和在SD卡中創建和刪除文件的權限。具體實現方法如下:<!-- 向SD卡中寫入數據的權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 在SD卡中創建和刪除文件的權限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
以上部分內容轉載或參考來源如下:
http://blog.csdn.net/flowingflying/article/details/6914812
http://www.cnblogs.com/leizhenzi/archive/2011/10/18/2216428.html
http://blog.csdn.net/ztp800201/article/details/7322110
在此表示感謝。
轉載請註明來源,版權歸原作者所有,未經同意嚴禁用於任何商業用途。
微博:http://weibo.com/theworldsong
郵箱:[email protected]