在存儲文件時,為了保證有充足的存儲空間大小,通常需要知道系統內部或者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值,判斷外部設置是否可以移除
