Android 儲存學習之在外部儲存中讀寫檔案

來源:互聯網
上載者:User

標籤:往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 儲存學習之在外部儲存中讀寫檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.