android開發關於和使用本機記憶體,內建儲存卡和外置儲存卡大揭秘

來源:互聯網
上載者:User

android開發關於和使用本機記憶體,內建儲存卡和外置儲存卡  --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 關於android儲存空間簡介:                   android開發常常需要涉及資料緩衝,這就需要我們瞭解手機當前使用的記憶體狀況,是否存在外置儲存卡,如果有怎麼辦,沒有是否使用內建儲存卡。     首先手機本機儲存空間,有Rom,Ram。      Rom  :在android中Rom相當於系統硬碟,當C盤用 ,很多時候要使用需要擷取root許可權。               一般可以分為機身記憶體和內建儲存(三星的多是叫:USB儲存空間);              機身記憶體包括system、data和cache等分區目錄,軟體預設都是安裝機身記憶體或者內建儲存卡裡的 。             data(就是手機儲存總量)+system(手機系統佔用)                              具體看是什麼手機;      Ram:在相當於電腦的運行記憶體,運存  。不多做解釋,就是隨機運行時記憶體,斷電資料全部消失。           外置儲存空間有:手機儲存空間 (TF卡), 相當於D,E ,F 等硬碟。     ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------      android開發中讀取手機儲存空間和外置儲存空間。  Android讀取手機記憶體之機身記憶體這個我反覆實驗過,可以弄入以及讀取資料到data目錄下,但是需要擷取root許可權,這個真有點糾結,難道要使用**軟體的人都去root下?。嘿嘿,所以這裡不推薦,這裡就不粘貼代碼了........     Android讀取手機記憶體之內建儲存空間執行個體 下面給出一個小例子來說明如何Android讀取手機記憶體裡的檔案,這在Android開發中是比較重要的一部分,如何要是掌握不好的話,我們就沒法把資料庫裡儲存的資料給讀出來,也就是說我們我們每一次玩遊戲的時候,我們的資料庫都是最原始的資料,這樣就會給我們帶來很多的麻煩。如果出現這樣的事情,那麼你的應用就是非常爛的,代碼如下:  [java] view plaincopypublic static InputStream readInternalFileInputStream(Context context,String fileName){                  /**    * 讀取手機記憶體檔案    *    */          try{      FileInputStream fis = context.openFileInput(fileName);          return fis;      }catch(Exception e){      return null;      }          }      public static String readInternalFile(Context context,String fileName){              /**    * 讀取手機記憶體檔案    *    */          try{      byte[] buffer = new byte[512];      int read =0;      StringBuffer stringbuffer = new StringBuffer();      FileInputStream fis = context.openFileInput(fileName);              do{      read = fis.read(buffer);      if(read>0)      stringbuffer.append(new String(buffer, 0, read, "utf-8"));          }while(read!=-1);              fis.close();      return stringbuffer.toString();              }catch(Exception e){      return null;      }          }        外置記憶體android 讀取sd卡中的圖片 一 讀取sd卡中的圖片     1 擷取讀取sd的許可權        在AndroidMainfest.xml檔案中添加    [java] view plaincopy        <!-- 在SDCard中建立與刪除檔案許可權 -->  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></uses-permission>  <!-- 往SDCard寫入資料許可權 -->  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>  <uses-permission android:name="android.permission.RESTART_PACKAGES" ></uses-permission>          注意:在<application...></application>前添加    2 找到sd卡的目錄(以真機的情況說明)  /**      *圖片檔案路徑 *列印Environment.getExternalStorageDirectory()得到:"/mnt/sdcard",即找到了sd卡的根目錄      */[java] view plaincopypublic String filePath=Environment.getExternalStorageDirectory()+"/client/tile/1_0_0.jpg";       3 根據路徑擷取圖片    [java] view plaincopyFile mfile=new File(path);  if (mfile.exists()) {//若該檔案存在  Bitmap bm = BitmapFactory.decodeFile(path);  return bm;  }   二 注意事項    在讀取sd卡中圖片的過程中的一些可用判斷     1 Environment.getExternalStorageState()擷取路徑是否成功       /*如擷取成功,傳回值為MEDIA_MOUNTED*/  [java] view plaincopyif(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))   {          String filePath=Environment.getExternalStorageDirectory().getPath();   }         2 擷取sd卡的許可權成功     /*fileName=Environment.getExternalStorageDirectory()+"/client" 是個檔案夾目錄*/[java] view plaincopyFile f = new File(fileName);  //可讀  if(f.canRead())  Log.v("EagleTag","very bad");  //可寫  if(f.canWrite())       Log.v("EagleTag","very good");     --------------------------------------------------------------------------------------------------------------      android的data和system以及cache系統目錄講解    /system 存放的是rom的資訊; /system/app 存放rom本身附帶的軟體即系統軟體; /system/data 存放/system/app 中核心系統軟體的資料檔案資訊。  /data 存放的是使用者的軟體資訊(非內建rom安裝的軟體); /data/app 存放使用者安裝的軟體; /data/data 存放所有軟體(包括/system/app 和 /data/app 和 /mnt/asec中裝的軟體)的一些lib和xml檔案等資料資訊; /data/dalvik-cache 存放程式的快取檔案,這裡的檔案都是可以刪除的。    /sdcard和/mnt/sdcard一樣嗎?/mnt/asce是幹嘛用的? 我來談談/mnt/asce目錄1、android升級到2.2以上,出現了這個目錄,這個目錄是幹什麼的呢?2、2.2以上,出現了新的功能,應用可以安裝的sd卡上,哪到底安裝在哪兒呢?我找遍了整個卡結果發現了所有這些應用安裝在.android 的asecure目錄下,要把卡放到讀卡機上去看才知道。3、那是如何與系統發生關係的,學過unix的人都知道,mnt是在/下的一個目錄,sd卡是通過mount掛接上去的,/mnt叫掛接點,系統就能通過掛接點/mnt訪問sd卡了4、在/mnt下有三個目錄如下:asec、secure、sdcard 其中asec就是我們安裝在卡上的應用、secure是用於sd卡應用程式安裝路徑加密的吧自己猜想的、sdcard就是卡上的其他內容。  /mnt/asce實際上對應的真正物理目錄是/mnt/sdcard/.android_secure(記住android_secure前有個點,這是個隱藏目錄)  我們回過來看/sdcard和/mnt/sdcard就容易理解: /sdcard 目錄,這是一個軟連結(相當於windows的檔案夾的捷徑),連結到/mnt/sdcard 目錄,即這個目錄的內容就是sdcard的內容。     因此,使用者程式安裝到到sd卡上後,其內容可能分散到:/mnt/asec , /mnt/secure , /data/data 。     要實現app2sd,目前比較流行有兩種方案,分別是app2ext 和 data2ext,下面分別介紹下這2種方案。     app2ext的原理是,刪除data區中的app檔案夾,然後在sd卡的ext分區上建立一個app檔案,並通過軟連結映射到data區。這樣系統會以為,app這個軟連結是一個真實的檔案夾,會把程式都安裝在裡面,但實際上,這些程式都安裝到卡上了。但由於作業系統並不知道,所以這種情況下,我們依然看到系統顯示這個程式是安裝在“內建空間”的。    data2ext則更徹底,它不是用軟連結,而是直接用“掛載”功能,Linux下所有的存放裝置都必須掛載成一個檔案夾才能進行檔案操作(如sd卡就掛載在/mnt/sdcard目錄下面)。data檔案夾本來是對應手機內部Flash中的一個分區(為了保持術語的準確,這裡要把內部Flash和記憶體相區別,內部Flash是ROM,記憶體是RAM)。而data2ext則是修改了掛載對應關係,使data檔案夾掛載的不是內建Flash,而是sd卡的整個ext分區。這樣,不僅是app,連儲存程式設定的data和緩衝dalvik-cache都會儲存到sd卡中。     可以看到,dalvik-cache和data這兩個檔案夾的位置,是這兩種方式的一個重大區別。其中dalvik-cache是虛擬機器先行編譯緩衝,data(不同於/data,這個是/data/data)是儲存程式資料的地方,例如遊戲的存檔記錄,軟體的配置資訊等。這樣有什麼區別,區別在於假如你重刷了ROM,app2ext的話,所有的程式都可以保留,但是這些程式的配置資訊和遊戲的存檔都會丟失。而data2ext則可以連同配置和存檔都保留,但是dalvik-cache也是一個容易積累垃圾的地方,這些垃圾也會一同保留。      data2ext由於是把整個data分區都放在sd卡上,因此,我們刷ROM需要WIPE的時候,這個data分區的內容就可能不會被wipe,這可以儲存使用者的設定檔,但是也可能造成系統莫名其妙的故障。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.