欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
徹底理解android中的內部存儲與外部存儲

我們先來(lái)考慮這樣一個(gè)問(wèn)題:

打開(kāi)手機設置,選擇應用管理,選擇任意一個(gè)App,然后你會(huì )看到兩個(gè)按鈕,一個(gè)是清除緩存,另一個(gè)是清除數據,那么當我們點(diǎn)擊清除緩存的時(shí)候清除的是哪里的數據?當我們點(diǎn)擊清除數據的時(shí)候又是清除的哪里的數據?讀完本文相信你會(huì )有答案。

在android開(kāi)發(fā)中我們常常聽(tīng)到這樣幾個(gè)概念,內存,內部存儲,外部存儲,很多人常常將這三個(gè)東西搞混,那么我們今天就先來(lái)詳細說(shuō)說(shuō)這三個(gè)東西是怎么回事?

內存,我們在英文中稱(chēng)作memory,內部存儲,我們稱(chēng)為InternalStorage,外部存儲我們稱(chēng)為ExternalStorage,這在英文中本不會(huì )產(chǎn)生歧義,但是當我們翻譯為中文之后,前兩個(gè)都簡(jiǎn)稱(chēng)為內存,于是,混了。

那么究竟什么是內部存儲什么是外部存儲呢?

首先我們打開(kāi)DDMS,有一個(gè)File Explorer,如下:


這里有三個(gè)文件夾需要我們重視,一個(gè)是data,一個(gè)是mnt,一個(gè)是storage,我們下面就詳細說(shuō)說(shuō)這三個(gè)文件夾。

1.內部存儲

data文件夾就是我們常說(shuō)的內部存儲,當我們打開(kāi)data文件夾之后(沒(méi)有root的手機不能打開(kāi)該文件夾),里邊有兩個(gè)文件夾值得我們關(guān)注,如下:

一個(gè)文件夾是app文件夾,還有一個(gè)文件夾就是data文件夾,app文件夾里存放著(zhù)我們所有安裝的app的apk文件,其實(shí),當我們調試一個(gè)app的時(shí)候,可以看到控制臺輸出的內容,有一項是uploading .....就是上傳我們的apk到這個(gè)文件夾,上傳成功之后才開(kāi)始安裝。另一個(gè)重要的文件夾就是data文件夾了,這個(gè)文件夾里邊都是一些包名,打開(kāi)這些包名之后我們會(huì )看到這樣的一些文件:

1.data/data/包名/shared_prefs
2.data/data/包名/databases
3.data/data/包名/files

4.data/data/包名/cache

如果打開(kāi)過(guò)data文件,應該都知道這些文件夾是干什么用的,我們在使用sharedPreferenced的時(shí)候,將數據持久化存儲于本地,其實(shí)就是存在這個(gè)文件中的xml文件里,我們App里邊的數據庫文件就存儲于databases文件夾中,還有我們的普通數據存儲在files中,緩存文件存儲在cache文件夾中,存儲在這里的文件我們都稱(chēng)之為內部存儲。

2.外部存儲

外部存儲才是我們平時(shí)操作最多的,外部存儲一般就是我們上面看到的storage文件夾,當然也有可能是mnt文件夾,這個(gè)不同廠(chǎng)家有可能不一樣。

一般來(lái)說(shuō),在storage文件夾中有一個(gè)sdcard文件夾,這個(gè)文件夾中的文件又分為兩類(lèi),一類(lèi)是公有目錄,還有一類(lèi)是私有目錄,其中的公有目錄有九大類(lèi),比如DCIM、DOWNLOAD等這種系統為我們創(chuàng )建的文件夾,私有目錄就是Android這個(gè)文件夾,這個(gè)文件夾打開(kāi)之后里邊有一個(gè)data文件夾,打開(kāi)這個(gè)data文件夾,里邊有許多包名組成的文件夾。


說(shuō)到這里,我想大家應該已經(jīng)可以分清楚什么是內部存儲什么是外部存儲了吧?好,分清楚之后我們就要看看怎么來(lái)操作內部存儲和外部存儲了。

3.操作存儲空間

首先,經(jīng)過(guò)上面的分析,大家已經(jīng)明白了,什么是內部存儲,什么是外部存儲,以及這兩種存儲方式分別存儲在什么位置,一般來(lái)說(shuō),我們不會(huì )自己去操作內部存儲空間,沒(méi)有root權限的話(huà),我們也沒(méi)法操作內部存儲空間,事實(shí)上內部存儲主要是由系統來(lái)維護的。不過(guò)在代碼中我們是可以訪(fǎng)問(wèn)到這個(gè)文件夾的。由于內部存儲空間有限,在開(kāi)發(fā)中我們一般都是操作外部存儲空間,Google官方建議我們App的數據應該存儲在外部存儲的私有目錄中該App的包名下,這樣當用戶(hù)卸載掉App之后,相關(guān)的數據會(huì )一并刪除,如果你直接在/storage/sdcard目錄下創(chuàng )建了一個(gè)應用的文件夾,那么當你刪除應用的時(shí)候,這個(gè)文件夾就不會(huì )被刪除。

經(jīng)過(guò)以上的介紹,我們可以總結出下面一個(gè)表格:

一目了然,什么是內部存儲,什么是外部存儲。

如果按照路徑的特征,我們又可以將文件存儲的路徑分為兩大類(lèi),一類(lèi)是路徑中含有包名的,一類(lèi)是路徑中不含有包名的,含有包名的路徑,因為和某個(gè)App有關(guān),所以對這些文件夾的訪(fǎng)問(wèn)都是調用Context里邊的方法,而不含有包名的路徑,和某一個(gè)App無(wú)關(guān),我們可以通過(guò)Environment中的方法來(lái)訪(fǎng)問(wèn)。如下圖:

大家看到,有包名的路徑我們都是調用Context中的方法來(lái)獲得,沒(méi)有包名的路徑,我們直接調用Environment中的方法獲得,那么其中有兩個(gè)方法需要傳入一個(gè)String類(lèi)型的參數,這個(gè)參數我們使用了Environment中的常量,參數的意思是我們要訪(fǎng)問(wèn)這個(gè)路徑下的哪個(gè)文件夾,比如getExternalFilesDir方法,我們看看它的源碼:

  1. /** 
  2.  * 
  3.  * @param type The type of files directory to return.  May be null for 
  4.  * the root of the files directory or one of 
  5.  * the following Environment constants for a subdirectory: 
  6.  * {@link android.os.Environment#DIRECTORY_MUSIC}, 
  7.  * {@link android.os.Environment#DIRECTORY_PODCASTS}, 
  8.  * {@link android.os.Environment#DIRECTORY_RINGTONES}, 
  9.  * {@link android.os.Environment#DIRECTORY_ALARMS}, 
  10.  * {@link android.os.Environment#DIRECTORY_NOTIFICATIONS}, 
  11.  * {@link android.os.Environment#DIRECTORY_PICTURES}, or 
  12.  * {@link android.os.Environment#DIRECTORY_MOVIES}. 
  13.  * 
  14.  * @return The path of the directory holding application files 
  15.  * on external storage.  Returns null if external storage is not currently 
  16.  * mounted so it could not ensure the path exists; you will need to call 
  17.  * this method again when it is available. 
  18.  * 
  19.  * @see #getFilesDir 
  20.  * @see android.os.Environment#getExternalStoragePublicDirectory 
  21.  */  
  22. @Nullable  
  23. public abstract File getExternalFilesDir(@Nullable String type);  
它的注釋非常多,我這里只列出其中一部分,我們看到,我們可以訪(fǎng)問(wèn)files文件夾下的Music文件夾、Movies文件夾等等好幾種。

說(shuō)到這里,我想大家對內部存儲、外部存儲該有了一個(gè)清晰的認識了吧。我們在開(kāi)發(fā)中,不建議往內部存儲中寫(xiě)太多的數據,畢竟空間有限。外部存儲在使用的時(shí)候最好能夠將文件存放在私有目錄下,這樣有利于系統維護,也避免用戶(hù)的反感。

現在我們再來(lái)看看我們一開(kāi)始提出的問(wèn)題,當我們點(diǎn)擊清除數據的時(shí)候清除的是哪里的數據呢?毫無(wú)疑問(wèn),當然是內部存儲目錄中相應的files和cache文件夾中的文件和外部存儲中相應的files和cache文件夾中的文件,至于這些文件夾的路徑我想你應該已經(jīng)明白了。

好了,最后再送給大家一個(gè)文件操作工具類(lèi):

  1. public class SDCardHelper {  
  2.   
  3.     // 判斷SD卡是否被掛載  
  4.     public static boolean isSDCardMounted() {  
  5.         // return Environment.getExternalStorageState().equals("mounted");  
  6.         return Environment.getExternalStorageState().equals(  
  7.                 Environment.MEDIA_MOUNTED);  
  8.     }  
  9.   
  10.     // 獲取SD卡的根目錄  
  11.     public static String getSDCardBaseDir() {  
  12.         if (isSDCardMounted()) {  
  13.             return Environment.getExternalStorageDirectory().getAbsolutePath();  
  14.         }  
  15.         return null;  
  16.     }  
  17.   
  18.     // 獲取SD卡的完整空間大小,返回MB  
  19.     public static long getSDCardSize() {  
  20.         if (isSDCardMounted()) {  
  21.             StatFs fs = new StatFs(getSDCardBaseDir());  
  22.             long count = fs.getBlockCountLong();  
  23.             long size = fs.getBlockSizeLong();  
  24.             return count * size / 1024 / 1024;  
  25.         }  
  26.         return 0;  
  27.     }  
  28.   
  29.     // 獲取SD卡的剩余空間大小  
  30.     public static long getSDCardFreeSize() {  
  31.         if (isSDCardMounted()) {  
  32.             StatFs fs = new StatFs(getSDCardBaseDir());  
  33.             long count = fs.getFreeBlocksLong();  
  34.             long size = fs.getBlockSizeLong();  
  35.             return count * size / 1024 / 1024;  
  36.         }  
  37.         return 0;  
  38.     }  
  39.   
  40.     // 獲取SD卡的可用空間大小  
  41.     public static long getSDCardAvailableSize() {  
  42.         if (isSDCardMounted()) {  
  43.             StatFs fs = new StatFs(getSDCardBaseDir());  
  44.             long count = fs.getAvailableBlocksLong();  
  45.             long size = fs.getBlockSizeLong();  
  46.             return count * size / 1024 / 1024;  
  47.         }  
  48.         return 0;  
  49.     }  
  50.   
  51.     // 往SD卡的公有目錄下保存文件  
  52.     public static boolean saveFileToSDCardPublicDir(byte[] data, String type,  
  53.             String fileName) {  
  54.         BufferedOutputStream bos = null;  
  55.         if (isSDCardMounted()) {  
  56.             File file = Environment.getExternalStoragePublicDirectory(type);  
  57.             try {  
  58.                 bos = new BufferedOutputStream(new FileOutputStream(new File(  
  59.                         file, fileName)));  
  60.                 bos.write(data);  
  61.                 bos.flush();  
  62.                 return true;  
  63.             } catch (Exception e) {  
  64.                 e.printStackTrace();  
  65.             } finally {  
  66.                 try {  
  67.                     bos.close();  
  68.                 } catch (IOException e) {  
  69.                     // TODO Auto-generated catch block  
  70.                     e.printStackTrace();  
  71.                 }  
  72.             }  
  73.         }  
  74.         return false;  
  75.     }  
  76.   
  77.     // 往SD卡的自定義目錄下保存文件  
  78.     public static boolean saveFileToSDCardCustomDir(byte[] data, String dir,  
  79.             String fileName) {  
  80.         BufferedOutputStream bos = null;  
  81.         if (isSDCardMounted()) {  
  82.             File file = new File(getSDCardBaseDir() + File.separator + dir);  
  83.             if (!file.exists()) {  
  84.                 file.mkdirs();// 遞歸創(chuàng )建自定義目錄  
  85.             }  
  86.             try {  
  87.                 bos = new BufferedOutputStream(new FileOutputStream(new File(  
  88.                         file, fileName)));  
  89.                 bos.write(data);  
  90.                 bos.flush();  
  91.                 return true;  
  92.             } catch (Exception e) {  
  93.                 e.printStackTrace();  
  94.             } finally {  
  95.                 try {  
  96.                     bos.close();  
  97.                 } catch (IOException e) {  
  98.                     // TODO Auto-generated catch block  
  99.                     e.printStackTrace();  
  100.                 }  
  101.             }  
  102.         }  
  103.         return false;  
  104.     }  
  105.   
  106.     // 往SD卡的私有Files目錄下保存文件  
  107.     public static boolean saveFileToSDCardPrivateFilesDir(byte[] data,  
  108.             String type, String fileName, Context context) {  
  109.         BufferedOutputStream bos = null;  
  110.         if (isSDCardMounted()) {  
  111.             File file = context.getExternalFilesDir(type);  
  112.             try {  
  113.                 bos = new BufferedOutputStream(new FileOutputStream(new File(  
  114.                         file, fileName)));  
  115.                 bos.write(data);  
  116.                 bos.flush();  
  117.                 return true;  
  118.             } catch (Exception e) {  
  119.                 e.printStackTrace();  
  120.             } finally {  
  121.                 try {  
  122.                     bos.close();  
  123.                 } catch (IOException e) {  
  124.                     // TODO Auto-generated catch block  
  125.                     e.printStackTrace();  
  126.                 }  
  127.             }  
  128.         }  
  129.         return false;  
  130.     }  
  131.   
  132.     // 往SD卡的私有Cache目錄下保存文件  
  133.     public static boolean saveFileToSDCardPrivateCacheDir(byte[] data,  
  134.             String fileName, Context context) {  
  135.         BufferedOutputStream bos = null;  
  136.         if (isSDCardMounted()) {  
  137.             File file = context.getExternalCacheDir();  
  138.             try {  
  139.                 bos = new BufferedOutputStream(new FileOutputStream(new File(  
  140.                         file, fileName)));  
  141.                 bos.write(data);  
  142.                 bos.flush();  
  143.                 return true;  
  144.             } catch (Exception e) {  
  145.                 e.printStackTrace();  
  146.             } finally {  
  147.                 try {  
  148.                     bos.close();  
  149.                 } catch (IOException e) {  
  150.                     // TODO Auto-generated catch block  
  151.                     e.printStackTrace();  
  152.                 }  
  153.             }  
  154.         }  
  155.         return false;  
  156.     }  
  157.   
  158.     // 保存bitmap圖片到SDCard的私有Cache目錄  
  159.     public static boolean saveBitmapToSDCardPrivateCacheDir(Bitmap bitmap,  
  160.             String fileName, Context context) {  
  161.         if (isSDCardMounted()) {  
  162.             BufferedOutputStream bos = null;  
  163.             // 獲取私有的Cache緩存目錄  
  164.             File file = context.getExternalCacheDir();  
  165.   
  166.             try {  
  167.                 bos = new BufferedOutputStream(new FileOutputStream(new File(  
  168.                         file, fileName)));  
  169.                 if (fileName != null  
  170.                         && (fileName.contains(".png") || fileName  
  171.                                 .contains(".PNG"))) {  
  172.                     bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);  
  173.                 } else {  
  174.                     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);  
  175.                 }  
  176.                 bos.flush();  
  177.             } catch (Exception e) {  
  178.                 e.printStackTrace();  
  179.             } finally {  
  180.                 if (bos != null) {  
  181.                     try {  
  182.                         bos.close();  
  183.                     } catch (IOException e) {  
  184.                         e.printStackTrace();  
  185.                     }  
  186.                 }  
  187.             }  
  188.             return true;  
  189.         } else {  
  190.             return false;  
  191.         }  
  192.     }  
  193.   
  194.     // 從SD卡獲取文件  
  195.     public static byte[] loadFileFromSDCard(String fileDir) {  
  196.         BufferedInputStream bis = null;  
  197.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  198.   
  199.         try {  
  200.             bis = new BufferedInputStream(  
  201.                     new FileInputStream(new File(fileDir)));  
  202.             byte[] buffer = new byte[8 * 1024];  
  203.             int c = 0;  
  204.             while ((c = bis.read(buffer)) != -1) {  
  205.                 baos.write(buffer, 0, c);  
  206.                 baos.flush();  
  207.             }  
  208.             return baos.toByteArray();  
  209.         } catch (Exception e) {  
  210.             e.printStackTrace();  
  211.         } finally {  
  212.             try {  
  213.                 baos.close();  
  214.                 bis.close();  
  215.             } catch (IOException e) {  
  216.                 e.printStackTrace();  
  217.             }  
  218.         }  
  219.         return null;  
  220.     }  
  221.   
  222.     // 從SDCard中尋找指定目錄下的文件,返回Bitmap  
  223.     public Bitmap loadBitmapFromSDCard(String filePath) {  
  224.         byte[] data = loadFileFromSDCard(filePath);  
  225.         if (data != null) {  
  226.             Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);  
  227.             if (bm != null) {  
  228.                 return bm;  
  229.             }  
  230.         }  
  231.         return null;  
  232.     }  
  233.   
  234.     // 獲取SD卡公有目錄的路徑  
  235.     public static String getSDCardPublicDir(String type) {  
  236.         return Environment.getExternalStoragePublicDirectory(type).toString();  
  237.     }  
  238.   
  239.     // 獲取SD卡私有Cache目錄的路徑  
  240.     public static String getSDCardPrivateCacheDir(Context context) {  
  241.         return context.getExternalCacheDir().getAbsolutePath();  
  242.     }  
  243.   
  244.     // 獲取SD卡私有Files目錄的路徑  
  245.     public static String getSDCardPrivateFilesDir(Context context, String type) {  
  246.         return context.getExternalFilesDir(type).getAbsolutePath();  
  247.     }  
  248.   
  249.     public static boolean isFileExist(String filePath) {  
  250.         File file = new File(filePath);  
  251.         return file.isFile();  
  252.     }  
  253.   
  254.     // 從sdcard中刪除文件  
  255.     public static boolean removeFileFromSDCard(String filePath) {  
  256.         File file = new File(filePath);  
  257.         if (file.exists()) {  
  258.             try {  
  259.                 file.delete();  
  260.                 return true;  
  261.             } catch (Exception e) {  
  262.                 return false;  
  263.             }  
  264.         } else {  
  265.             return false;  
  266.         }  
  267.     }  
  268. }  

本文相關(guān)筆記和源碼下載http://download.csdn.net/detail/u012702547/9348985


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
21、從頭學(xué)Android之Android的數據存儲
android的Environment類(lèi) .
Android Studio Android數據存儲五種方式總結
android開(kāi)發(fā)中的文件操作
【轉】APP的緩存文件到底應該存在哪?看完這篇文章你應該就自己清楚了
簡(jiǎn)書(shū) · 了解 Android 應用的文件存儲目錄,掌握持久化數據的正確姿勢
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久