趕上智能手機剛問世時有幸用過的小伙伴都知道,那時候的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,即可獲取圖片信息。