4、文件存儲File
File即傳統的I/O 流存儲文件,Activity提供了openFileOutput()方法可以用於把數據輸出到文件中,
具體的實現過程與在J2SE環境中保存數據到文件中是一樣的。
下面例子演示 如何保存文件、讀取文件和把文件保存在SD卡上。
(1) 保存文件
復制代碼
1 public void save(String str) {
2
3 try {
4 FileOutputStream output = this.openFileOutput("test.txt", Context.MODE_WORLD_READABLE);
5 output.write(str.getBytes());
6 output.close();
7 Toast.makeText(MainActivity.this,"Saved",Toast.LENGTH_LONG).show();
8 } catch (IOException e) {
9 // TODO: handle exception
10 }
11
12 }
復制代碼
openFileOutput()方法的第一參數用於指定文件名稱,不能包含路徑分隔符“/” ,如果文件不存在,Android 會自動創建它。
創建的文件保存在/data/data/<package name>/files目錄,如: /data/data/com.example.filesave/files/test.txt
openFileOutput()方法的第二參數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,
如果想把新寫入的內容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有權限讀寫該文件。
MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。
如果希望文件被其他應用讀和寫,可以傳入:
openFileOutput("test.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 ,只有這樣其他程序才能正確訪問。
(2) 讀取文件
復制代碼
1 public String load() {
2 String str = "";
3 try {
4 FileInputStream input = this.openFileInput("test.txt");
5 ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
6 byte[] buffer = new byte[1024];
7
8 int length = -1;
9
10 while ((length=input.read(buffer))!=-1) {
11 byteOutput.write(buffer,0,length);
12
13 }
14
15 input.close();
16 byteOutput.close();
17
18 str = byteOutput.toString();
19
20 } catch (IOException e) {
21 // TODO Auto-generated catch block
22 e.printStackTrace();
23 }
24
25 return str;
26
27 }
復制代碼
對於私有文件只能被創建該文件的應用訪問,如果希望文件能被其他應用讀和寫,可以在創建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權限。
Activity還提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用於獲取/data/data/<package name>/cache目錄
getFilesDir()方法用於獲取/data/data/<package name>/files目錄。
打印文件讀取的內容:
(3) 創建SD卡
使用Activity的openFileOutput()方法保存文件,文件是存放在手機空間上,一般手機的存儲空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行的。對於像視頻這樣的大文件,我們可以把它存放在SDCard。 SDCard是干什麼的?你可以把它看作是插在手機上的移動硬盤或U盤。
創建模擬器SD卡,並設文件為可讀狀態
1.打開你安裝Android的文件夾找到tools這個文件夾,復制路徑
2.設置命令提示符的默認路徑為你復制的路徑
3.在後面輸入如下命令(注意空格):
mksdcard 256M C:\Users\chendd\Desktop\sdcard.img
256M是你要設置SD卡的大小,後面是你創建虛擬SD卡的路徑。
回車,這樣就創建好了SD卡的鏡像文件,還要讓Android模擬器知道這個SD卡在什麼地方,命令如下:
dir C:\Users\chendd\Desktop\sdcard.img
再次回車
4、設置模擬器,edit裡SD Card 選擇File,然後browse你的sdcard.img,再edit AVD結束。通過DDMS添加試試看,這個時候File Exprorer下的sdcard的permissions變成了d---rwxr-x,就可以添加了。
在程序中訪問SDCard,你需要申請訪問SDCard的權限。
在AndroidManifest.xml中加入訪問SDCard的權限如下:
1 <!-- 在SDCard中創建與刪除文件權限 -->
2 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
3
4 <!-- 往SDCard寫入數據權限 -->
5 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(4) 保存文件在SD卡上
要往SDCard存放文件,程序必須先判斷手機是否裝有SDCard,並且可以進行讀寫
復制代碼
1 public void save_sd(String str) {
2
3 File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目錄
4
5 File saveFile = new File(sdCardDir, "testsd.txt");
6
7 FileOutputStream outStream;
8 try {
9 outStream = new FileOutputStream(saveFile);
10 outStream.write(str.getBytes());
11 outStream.close();
12 } catch (IOException e) {
13 // TODO Auto-generated catch block
14 e.printStackTrace();
15 }
16
17 }
復制代碼
Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄,當然要獲取SDCard的目錄,你也可以這樣寫:
File sdCardDir = new File("/sdcard"); //獲取SDCard目錄
File saveFile = new File(sdCardDir, "test.txt");
// 第一種寫法更靈活
//上面兩句代碼可以合成一句: File saveFile = new File("/sdcard/a.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("test".getBytes());
outStream.close();