知識(shí)點(diǎn):
內(nèi)部存儲(chǔ)空間獲取總大小和可用大??;
sdcard存儲(chǔ)空間獲取總大小和可用大??;
新名詞記錄{StatFs:描述文件系統(tǒng)信息的類(lèi)}
概覽
在開(kāi)發(fā)中,我們或多或少都會(huì)用到存儲(chǔ)空間進(jìn)行存儲(chǔ)數(shù)據(jù)。移動(dòng)設(shè)備上可以有兩種的存儲(chǔ)方式:手機(jī)內(nèi)部空間和sdcard外部空間。對(duì)于要使用存儲(chǔ)空間,要使用哪一個(gè)?如何判斷是否有足夠的空間?sdcard是否掛載?等等諸多問(wèn)題就來(lái)了。
對(duì)于設(shè)備內(nèi)部存儲(chǔ)空間來(lái)說(shuō),是一定會(huì)存在的。如果使用內(nèi)部存儲(chǔ)空間,我們需要做的是判斷內(nèi)部存儲(chǔ)空間是否有足夠大的可用空間給我們使用?,F(xiàn)在的移動(dòng)設(shè)備,手機(jī)廠商已經(jīng)將內(nèi)部存儲(chǔ)做得很大很大了,一般來(lái)說(shuō)用戶都足夠用了。
對(duì)于sdcard,這個(gè)是用戶外部選擇性的進(jìn)行存儲(chǔ)空間擴(kuò)展的,事實(shí)上不一定會(huì)有sdcard。尤其是在現(xiàn)在Android移動(dòng)設(shè)備廠商提供的內(nèi)部存儲(chǔ)空間越來(lái)越大,起步的已經(jīng)都是32G了,更大的可以去到128G,所以用戶可能就不需要再進(jìn)行sdcard的擴(kuò)展了。但是,設(shè)備內(nèi)部存儲(chǔ)空間小,需要用到外部存儲(chǔ)空間的情況還是可能會(huì)出現(xiàn)的。而且可以知道主流的APP對(duì)于一些非私密的數(shù)據(jù),例如圖片,歌曲以及下載的更新包等,都會(huì)選擇放置在sdcard里,以減少占用內(nèi)部存儲(chǔ)空間。
說(shuō)了這么多,我們還是有必要對(duì)上面兩種存儲(chǔ)空間的使用作一個(gè)說(shuō)明,如何獲取存儲(chǔ)空間是否可用,可用空間是否足夠大等問(wèn)題。
內(nèi)部存儲(chǔ)空間
我們知道,存儲(chǔ)硬件的空間是按著區(qū)塊來(lái)劃分的,每個(gè)區(qū)塊有固定的大小。存儲(chǔ)設(shè)備的總大小=區(qū)塊大小*區(qū)塊數(shù)量。通過(guò)StatFs類(lèi),我們可以獲取到總的區(qū)塊,可用區(qū)塊和每個(gè)區(qū)塊的字節(jié)大小等信息。
具體看代碼:
/** * 獲取手機(jī)內(nèi)部空間總大小 * * @return 大小,字節(jié)為單位 */ static public long getTotalInternalMemorySize() { //獲取內(nèi)部存儲(chǔ)根目錄 File path = Environment.getDataDirectory(); //系統(tǒng)的空間描述類(lèi) StatFs stat = new StatFs(path.getPath()); //每個(gè)區(qū)塊占字節(jié)數(shù) long blockSize = stat.getBlockSize(); //區(qū)塊總數(shù) long totalBlocks = stat.getBlockCount(); return totalBlocks * blockSize; } /** * 獲取手機(jī)內(nèi)部可用空間大小 * * @return 大小,字節(jié)為單位 */ static public long getAvailableInternalMemorySize() { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); //獲取可用區(qū)塊數(shù)量 long availableBlocks = stat.getAvailableBlocks(); return availableBlocks * blockSize; }用以上兩個(gè)方法,就可以獲得內(nèi)部存儲(chǔ)空間總大小和可用大小了。
sdcard外部存儲(chǔ)空間
/** * 判斷SD卡是否可用 * * @return true : 可用<br>false : 不可用 */ public static boolean isSDCardEnable() { return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); }/** * 獲取手機(jī)外部總空間大小 * * @return 總大小,字節(jié)為單位 */ static public long getTotalExternalMemorySize() { if (isSDCardEnable()) { //獲取SDCard根目錄 File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long totalBlocks = stat.getBlockCount(); return totalBlocks * blockSize; } else { return -1; } } /** * 獲取SD卡剩余空間 * * @return SD卡剩余空間 */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public static String getFreeSpace() { if (!isSDCardEnable()) return "sdcard unable!"; StatFs stat = new StatFs(getSDCardPath()); long blockSize, availableBlocks; availableBlocks = stat.getAvailableBlocksLong(); blockSize = stat.getBlockSizeLong(); long size = availableBlocks * blockSize / 1024L; return String.valueOf(size); }統(tǒng)一描述sdcard的信息
/** * 獲取SD卡信息 * * @return SDCardInfo */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public static String getSDCardInfo() { SDCardInfo sd = new SDCardInfo(); if (!isSDCardEnable()) return "sdcard unable!"; sd.isExist = true; StatFs sf = new StatFs(Environment.getExternalStorageDirectory().getPath()); sd.totalBlocks = sf.getBlockCountLong(); sd.blockByteSize = sf.getBlockSizeLong(); sd.availableBlocks = sf.getAvailableBlocksLong(); sd.availableBytes = sf.getAvailableBytes(); sd.freeBlocks = sf.getFreeBlocksLong(); sd.freeBytes = sf.getFreeBytes(); sd.totalBytes = sf.getTotalBytes(); return sd.toString(); } public static class SDCardInfo { boolean isExist; long totalBlocks; long freeBlocks; long availableBlocks; long blockByteSize; long totalBytes; long freeBytes; long availableBytes; @Override public String toString() { return "isExist=" + isExist + "/ntotalBlocks=" + totalBlocks + "/nfreeBlocks=" + freeBlocks + "/navailableBlocks=" + availableBlocks + "/nblockByteSize=" + blockByteSize + "/ntotalBytes=" + totalBytes + "/nfreeBytes=" + freeBytes + "/navailableBytes=" + availableBytes; } }總結(jié)
以上就是分別獲取兩個(gè)不同的存儲(chǔ)空間總大小和可用大小的示例。希望對(duì)大家有用。
如有任何問(wèn)題,請(qǐng)及時(shí)與我聯(lián)系,謝謝!
這篇Android之獲取手機(jī)內(nèi)部及sdcard存儲(chǔ)空間的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選