Android數據存儲之SD卡文件操作


趕上智能手機剛問世時有幸用過的小伙伴都知道,那時候的Android系統是把我們自己買的SD卡作為外部存儲的,但是不知道從哪天開始,SD卡就被固化到智能手機的內部了,但是我們仍然把它稱為外部存儲。我想Android這樣做的原因大概是因為市面上SD卡質量有好有壞,可能會影響APP運行吧(因為筆者就有過APP數據完全丟失的慘痛經歷)。

獲取手機上的SD卡信息通過Environment類實現,該類是App獲取各種目錄信息的工具,主要方法有以下7種:

  · getRootDirectory:獲得系統根目錄的路徑。

  · getDataDirectory: 獲得系統數據目錄的路徑。

  · getDownloadCacheDirectory: 獲得下載緩存目錄的路徑。

  · getExternalStorageDirectory:獲得SD卡的路徑。

  · getExternalStorageState: 獲得SD卡的狀態。

  · getStorageState: 獲得指定目錄的狀態

  · getExternalStoragePublicDirectory: 獲得SD卡指定類型目錄的路徑

為正常操作SD卡,需要在AndroidManifest.xml文件中聲明SD卡的權限,具體代碼如下:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

上述七種方式的使用效果如下:

 

 

在Android系統中,外部存儲空間分為公有存儲空間和私有存儲空間兩部分,顧名思義,公有存儲空間是所有應用都可以訪問的空間,而私有存儲空間只能當前應用自己讀寫,其他應用沒有訪問權限。既然有兩部分存儲空間,那么這兩個部分的路徑獲取方法也肯定是不一樣的,前者通過前面提到的Environment.getExternalStoragePublicDirectory方法獲得,后者通過getExternalFilesDir方法獲得,代碼就是簡單的方法調用,這里不再給出。

說完了存儲路徑的獲取,就正式到了文件讀寫的步驟了,這里只簡單說一下文本文件讀寫和圖片文件讀寫

文本文件讀寫一般借助於FileOutputStream和FileInputStream,文件輸入輸出流是java語言的基礎工具,這里也不再詳細介紹,只給出代碼:

//把字符串保存到指定路徑的文本文件
    public static void saveText(String path,String txt){
        try {
            FileOutputStream fos=new FileOutputStream(path);//根據文件路徑構建文件輸出流對象
            fos.write(txt.getBytes());//把字符串寫入文件輸出流
            fos.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //從指定路徑的文本文件中讀取內容字符串
    public static String openText(String path){
        String readStr="";
        try{
            FileInputStream fis=new FileInputStream(path);//根據文件路徑構建文件輸入流
            byte[] b=new byte[fis.available()];
            fis.read(b);//從文件輸入流讀取字節數組
            readStr=new String(b);//把字節數組轉化成字符串
            fis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return readStr;
    }

Android的圖片處理類是Bitmap,App讀寫Bitmap可以使用FileOutputStream 和FileInputStream。不過在實際開發中,讀寫圖片文件一般用性能更好的BufferedOutputStream和BufferedInputStream。保存圖片文件時用到Bitmap的compress方法,可指定圖片類型和壓縮質量;打開圖片文件時使用BitmapFactory的decodeStream方法。讀寫圖片的具體代碼如下:

//把位圖數據保存到指定路徑的圖片文件
    public static void saveImage(String path,Bitmap bitmap){
        try{
            //根據指定文件路徑構建緩存輸出流對象
            BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(path));
            //把位圖數據壓縮到緩存輸出流中
            bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
            //完成緩存輸出流的寫入動作
            bos.flush();
            //關閉緩存輸出流
            bos.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //從指定路徑的圖片文件中讀取位圖數據
    public static Bitmap openImage(String path){
        Bitmap bitmap=null;
        try {
            //根據指定文件路徑構架緩存輸入流對象
            BufferedInputStream bis=new BufferedInputStream(new FileInputStream(path));
            //從緩存輸入流中解碼位圖數據
            bitmap= BitmapFactory.decodeStream(bis);
            bis.close();//關閉緩存輸入流
        }catch (Exception e){
            e.printStackTrace();
        }
        //返回圖片文件中的位圖數據
        return bitmap;
    }

除了decodeStream之外,BitmapFactory還提供了其他方便簡單的方法:

  · decodeFile: 該方法直接傳文件路徑的字符串,即可將指定路徑的圖片讀取到bitmap對象

  · decodeResourse: 該方法主要是針對drawable的圖片文件,第一個參數傳getResourses(),第二個參數傳drawable的圖片資源id,即可獲取圖片信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM