Android文件存儲基礎

手機內部存儲

. 手機內部存儲,默認在/data/data/<包名>/files文件夾下存放。

手機內部存儲的特點:

1:存放本應用的私有數據,當應用卸載時,/data/data/<包名>這個目錄會同步刪除,即手機內部存儲的文件會刪除
* 關注點:
& Context.openFileOutput(String name, int mode)
- 往手機內部存儲中以某種模式寫文件
- name :文件名
- mode :文件操作模式
- return:FileOutputStream
- 文件存放在/data/data/包名/files/
. Context.openFileInput(String name) 從手機內部存儲中讀取文件
- 從手機內部存儲中讀文件
- name:文件名
- return:FileInputStream
. getCacheDir() 方法用於獲取/data/data//cache目錄
. getFilesDir() 方法用於獲取/data/data//files目錄

文件操作模式
這裏寫圖片描述

外部存儲

. . 所有兼容Android的設備都支持一個可共享的“外部存儲(external storage)”,可用來保存文件。這可以是一個可移動的存儲設備(比如SD卡)或者一個內部的(不可移動的)存儲。保存在外部存儲的文件是可全局讀寫的。

Sdcard存儲的特點:

. 依賴於Sdcard,使用SDCard存儲,需先檢測其狀態
. 存在Sdcard的文件是可全局讀寫的
. 寫入Sdcard時,需要權限
* 關注點:
. Environment.getExternalStorageState() 取得外部存儲狀態
. Environment.getExternalStorageDirectory() 取得外部存儲根路徑
. 寫入外部存儲的權限
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.WRITE_EXTERNAL_STORAGE
* 外存路徑描述
. 取得外部存儲的公共共享存儲路徑
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
. 在外存中存放應用的私有文件,當應用刪除時,該內容會同步刪除 :
context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
目錄: /android/data/<包名>/files/<類型>
.在外存中存放應用的私有緩存文件 ,當應用刪除時,該內容會同步刪除
context.getExternalCacheDir()
目錄:/android/data/<包名>/cache
.取得外存的根路徑
Environment.getExternalStorageDirectory()

代碼實現(手機內部存取)

//存文件到手機內存
    public void saveToPhone(String filename, String fileBody) 
throws Exception{
//以私有模式打開文件,假如filename不存在,
//則創建該文件,路徑:/data/data/<包名>
        FileOutputStream fos=
context.openFileOutput(filename, Context.MODE_APPEND);
        //把內容寫到輸出流中
        fos.write(fileBody.getBytes());
        //關閉輸出流
        fos.close();
    }
   //從手機內部存儲讀文件
    public String readFromPhone(String filename) throws Exception{
        //從手機內存中讀文件,路徑:/data/data/<包名>
        FileInputStream fis=context.openFileInput(filename);
        //字節數組輸出流
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        byte[] buffer=new byte[1024];
        int len=-1;
        while((len=fis.read(buffer))!=-1){
            baos.write(buffer, 0, len);
        }
        //關閉內存中的字節數組輸出流
        baos.close();
        //關閉輸入流
        fis.close();
        return new String(baos.toByteArray());
    }

代碼實現(SDCard存取)

//存文件到sdcard
    public void saveToSdcard(String filename, String fileBody) 
throws Exception {
        /**
         * 寫數據到sdcard
         * 1、先判斷sdcard 是否掛載
         * 2、假如有:獲取sdcard 路徑
         * 3、在sdcard中創建文件,並且開闢輸出流
         * 4、寫數據到輸出流
         * 5、關閉輸出流
         */
        //假如Sdcard掛載成功
        if(Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)){
            //獲得Sdcard的根目錄
            File root=Environment.getExternalStorageDirectory();
            File file=new File(root, filename);
            FileOutputStream fos=new FileOutputStream(file);
            fos.write(fileBody.getBytes());
            fos.close();
        }
    }
    //從SDCard讀文件
    public String readFromSdcard(String filename)throws Exception {
        //判斷SDCard狀態
      if(Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)){
            //獲取外存的根路徑
            File root=Environment.getExternalStorageDirectory();
            //創建文件
            File file=new File(root, filename);
            //開闢輸入流
            FileInputStream fis=new FileInputStream(file);
            //緩存
            ByteArrayOutputStream baos=new ByteArrayOutputStream();
            byte[] buffer=new byte[1024];
            int len=-1;
            while((len=fis.read(buffer))!=-1){
                baos.write(buffer, 0, len);
            }
            baos.close();
            fis.close();
            return new String(baos.toByteArray());
        }
        return null;
    }

個人筆記僅供參考,如果有誤,歡迎指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章