在存儲文件時,為了保證有充足的存儲空間大小,通常需要知道系統內部或者sdcard的剩余存儲空間大小,這里就需要用到StatFs類。
1. 判斷 SDCard 是否存在,並且是否具有可讀寫權限
/**
* 外部存儲是否可用 (存在且具有讀寫權限)
* @return
*/
staticpublicboolean isExternalStorageAvailable() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
/** * 外部存儲是否可用 (存在且具有讀寫權限) * @return */ static public boolean isExternalStorageAvailable() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); }
2.獲取手機系統可用空間大小
/**
* 獲取手機內部可用空間大小
* @return
*/
staticpubliclong getAvailableInternalMemorySize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return availableBlocks * blockSize;
}
/** * 獲取手機內部可用空間大小 * @return */ static public long getAvailableInternalMemorySize() { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return availableBlocks * blockSize; }
3.獲取手機內部總空間大小
/**
* 獲取手機內部空間大小
* @return
*/
staticpubliclong getTotalInternalMemorySize() {
File path = Environment.getDataDirectory();//Gets the Android data directory
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize(); //每個block 占字節數
long totalBlocks = stat.getBlockCount(); //block總數
return totalBlocks * blockSize;
}
/** * 獲取手機內部空間大小 * @return */ static public long getTotalInternalMemorySize() { File path = Environment.getDataDirectory();//Gets the Android data directory StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); //每個block 占字節數 long totalBlocks = stat.getBlockCount(); //block總數 return totalBlocks * blockSize; }
4.獲取手機外部可用空間大小、獲取手機外部總空間大小
/**
* 獲取手機外部可用空間大小
* @return
*/
staticpubliclong getAvailableExternalMemorySize() {
if (isExternalStorageAvailable()) {
File path = Environment.getExternalStorageDirectory();//獲取SDCard根目錄
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return availableBlocks * blockSize;
} else {
return -1;
}
}
/**
* 獲取手機外部總空間大小
* @return
*/
staticpubliclong getTotalExternalMemorySize() {
if (isExternalStorageAvailable()) {
File path = Environment.getExternalStorageDirectory(); //獲取SDCard根目錄
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return totalBlocks * blockSize;
} else {
return -1;
}
}
/** * 獲取手機外部可用空間大小 * @return */ static public long getAvailableExternalMemorySize() { if (isExternalStorageAvailable()) { File path = Environment.getExternalStorageDirectory();//獲取SDCard根目錄 StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return availableBlocks * blockSize; } else { return -1; } } /** * 獲取手機外部總空間大小 * @return */ static public long getTotalExternalMemorySize() { if (isExternalStorageAvailable()) { File path = Environment.getExternalStorageDirectory(); //獲取SDCard根目錄 StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long totalBlocks = stat.getBlockCount(); return totalBlocks * blockSize; } else { return -1; } }
注意: 訪問SDCard進行文件讀寫時:
在AndroidManifest.xml中加入訪問SDCard的權限如下:
<!-- 在SDCard中創建與刪除文件權限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard寫入數據權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
接着我們在使用SDcard進行讀寫的時候 會用到Environment類下面的幾個靜態方法:
1:getDataDirectory() 獲取到Android中的data數據目錄
2:getDownloadCacheDirectory() 獲取到下載的緩存目錄
3:getExternalStorageDirectory() 獲取到外部存儲的目錄 一般指SDcard
4:getExternalStorageState() 獲取外部設置的當前狀態 一般指SDcard,
android系統中對於外部設置的狀態,比較常用的是 MEDIA_MOUNTED(SDcard存在且可以進行讀寫) MEDIA_MOUNTED_READ_ONLY (SDcard存在,只可以進行讀操作) 當然還有其他的一些狀態,可以在文檔中進行查找到。
5:getRootDirectory() 獲取到Android Root路徑
6:isExternalStorageEmulated() 返回Boolean值判斷外部設置是否有效
7:isExternalStorageRemovable() 返回Boolean值,判斷外部設置是否可以移除