標籤:往sdcard中讀寫檔案 並判斷sdcard的狀態 以及sdcard的容量大小是否滿足
上節學習了如何在手機內部儲存中讀寫檔案,本節學習如何在手機的外部儲存中讀寫檔案。那就是如何在Sdcard中讀寫檔案。
那我們還是用以前登入介面的例子舉例說明,(登入介面請看上節Android 儲存學習之在內部儲存中讀寫檔案)
先我們顯示寫的代碼:
當點擊確定並且自動登入的鉤是選中的,則就會在sdcard檔案夾寫建立一個info.txt檔案
public void login(View v) { String name = ed_nam.getText().toString(); String passwd = ed_passwd.getText().toString(); //判斷使用者名稱或者密碼是否輸入 if((name.equals("")) || (passwd.equals(""))) { Toast.makeText(this, "使用者名稱或密碼不可為空", Toast.LENGTH_SHORT).show(); } else { //如果選中自動登入,我們就需要儲存使用者名稱和密碼 if(cb.isChecked()) { //建立一個檔案,使用者儲存使用者名稱和密碼 File file = new File("sdcard/info.txt"); try { FileOutputStream fos = new FileOutputStream(file);//寫入使用者名稱和密碼,以name##passwd的格式寫入fos.write((name + "##" + passwd).getBytes());//關閉輸出資料流fos.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} } Toast.makeText(this, "登入成功", Toast.LENGTH_SHORT).show();} }}
執行後,顯示效果如下:
同理讀也就是將上節讀取的路徑改為sdcard的路徑即可:
public void readInfo(){File file = new File("sdcard/info.txt");//如果檔案存在,則讀取if(file.exists()){try {FileInputStream fin = new FileInputStream(file);//把位元組流轉化為字元流BufferedReader buffer = new BufferedReader(new InputStreamReader(fin));//讀取檔案中的使用者名稱和密碼String text = buffer.readLine();//以##為關鍵字分割字元String s[] = text.split("##");//設定進EditTexted_nam.setText(s[0]);ed_passwd.setText(s[1]);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
當然了,同理可知到。我們上面那些寫Sdcard的路徑是不對的,程式的健壯性不是很高,那就的用Google提供的訪問sdcard的API:getExternalStorageDirectory
//建立一個檔案,使用者儲存使用者名稱和密碼 //File file = new File("sdcard/info.txt"); File file = new File(Environment.getExternalStorageDirectory(), "info.txt");設想一種情況,當我們往sdcard中寫一個檔案,但是由於sdcard容量有限,不足與放下此檔案,所以在使用者打算放入一個檔案到sdcard中時,需要先判斷儲存空間是不滿足,不滿足請使用者給予提醒即可。
那如何獲得sdcard的當前可用容量:
//使用者判斷是否檔案大小超過sdcard的容量public Boolean sdcardAvailable(int size){File file = Environment.getExternalStorageDirectory();StatFs stat = new StatFs(file.getPath());//每個塊的大小long blockSize = stat.getBlockSize();//公用分為多少個塊long totalBlocks = stat.getBlockCount();//共有多少可用的空間,單位為位元組long availableBlocks = stat.getAvailableBlocks();if(availableBlocks > size){return true;}return false;}
當寫入一個檔案時,先和sdcard的可用空間比較即可:
try { FileOutputStream fos = new FileOutputStream(file);//寫入使用者名稱和密碼,以name##passwd的格式寫入//要寫入的資料長度,單位是位元組int len = (name + "##" + passwd).getBytes().length/8;if(sdcardAvailable(len)){fos.write((name + "##" + passwd).getBytes());}else {Toast.makeText(this, "sdcard儲存空間不足", Toast.LENGTH_SHORT).show();}//關閉輸出資料流fos.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}
這樣就能避免檔案過大,寫到一半出現容量不足的情況。
再設想一種情況,當我們突然往sdcard中寫入內容時,如果sdcard出現某些問題,沒有掛載,那也是不能寫入東西的。所以,讀寫之前需要判斷sdcard是否正常運行
if(cb.isChecked()) { //建立一個檔案,使用者儲存使用者名稱和密碼 //File file = new File("sdcard/info.txt"); /* MEDIA_CHECKING: sd卡正在準備 * MEDIA_MOUNTED:sd卡已經掛載,並且正在讀寫訪問 * MEDIA_REMOVED:沒有sd卡 * MEDIA_UNKNOWN:不能識別sd卡 * MEDIA_UNMOUNTED:sd卡存在,但沒有掛載 * */ if(Environment.getExternalStorageDirectory().equals(Environment.MEDIA_MOUNTED)) { File file = new File(Environment.getExternalStorageDirectory(), "info2.txt"); try { FileOutputStream fos = new FileOutputStream(file);//寫入使用者名稱和密碼,以name##passwd的格式寫入//要寫入的資料長度,單位是位元組int len = (name + "##" + passwd).getBytes().length/8;if(sdcardAvailable(len)){fos.write((name + "##" + passwd).getBytes());}else {Toast.makeText(this, "sdcard儲存空間不足", Toast.LENGTH_SHORT).show();}//關閉輸出資料流fos.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} } } Toast.makeText(this, "登入成功", Toast.LENGTH_SHORT).show();}
也就是在讀寫時,先判斷sdcard是否已經正在運行,如果sdcard的狀態是ok的。則執行接下來的操作即可
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android 儲存學習之在外部儲存中讀寫檔案