惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
云风的 BLOG
云风的 BLOG
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Announcements
Recent Announcements
IT之家
IT之家
Google DeepMind News
Google DeepMind News
罗磊的独立博客
爱范儿
爱范儿
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
U
Unit 42
MongoDB | Blog
MongoDB | Blog
S
SegmentFault 最新的问题
B
Blog
博客园 - 叶小钗
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - cppguy

合并odex和少dex的apk RGB 直接打开文件系统的sqlite DB Android 的 dex2jar 和 jd-gui 反编译 apk 源代码 Android 内存泄漏调试 Linerlayout Layout_wight 静态编译将jar打入apk 强制竖屏 Apk打入静态jar包的MakeFile Mercurial - 分布式版本控制系统 layout_gravity与android:gravity的区别 Android am usage TextView 加下划线 px 与 pt Android修改DNS Dalvik虚拟机 Android签名 启动Activity MediaScanner
Android获取内部和外部内存空间大小
cppguy · 2011-03-08 · via 博客园 - cppguy

2011-03-08 17:45  cppguy  阅读(3481)  评论()    收藏  举报

Android.os下的StatFs类主要用来获取文件系统的状态,能够获取sd卡的大小和剩余空间,获取系统内部空间也就是/system的大小和剩余空间等等。

看下读取sd卡的:

void readSDCard() {
	String state = Environment.getExternalStorageState();
	if (Environment.MEDIA_MOUNTED.equals(state)) {
		File sdcardDir = Environment.getExternalStorageDirectory();
		StatFs sf = new StatFs(sdcardDir.getPath());
		long blockSize = sf.getBlockSize();
		long blockCount = sf.getBlockCount();
		long availCount = sf.getAvailableBlocks();
		Log.d("" , "block大小:" + blockSize+ ",block数目:" + blockCount+ ",总大小:" +blockSize*blockCount/ 1024 + "KB" );
		Log.d("" , "可用的block数目::" + availCount+ ",剩余空间:" + availCount*blockSize/ 1024 + "KB" );
	}
}

void readSDCard() {
	String state = Environment.getExternalStorageState();
	if(Environment.MEDIA_MOUNTED.equals(state)) {
		File sdcardDir = Environment.getExternalStorageDirectory();
		StatFs sf = new StatFs(sdcardDir.getPath());
		long blockSize = sf.getBlockSize();
		long blockCount = sf.getBlockCount();
		long availCount = sf.getAvailableBlocks();
		Log.d("", "block大小:"+ blockSize+",block数目:"+ blockCount+",总大小:"+blockSize*blockCount/1024+"KB");
		Log.d("", "可用的block数目::"+ availCount+",剩余空间:"+ availCount*blockSize/1024+"KB");
	}
}

然后看下读取系统内部空间的:

void readSystem() {
	File root = Environment.getRootDirectory();
	StatFs sf = new StatFs(root.getPath());
	long blockSize = sf.getBlockSize();
	long blockCount = sf.getBlockCount();
	long availCount = sf.getAvailableBlocks();
	Log.d("" , "block大小:" + blockSize+ ",block数目:" + blockCount+ ",总大小:" +blockSize*blockCount/ 1024 + "KB" );
	Log.d("" , "可用的block数目::" + availCount+ ",可用大小:" + availCount*blockSize/ 1024 + "KB" );
}

void readSystem() {
	File root = Environment.getRootDirectory();
	StatFs sf = new StatFs(root.getPath());
	long blockSize = sf.getBlockSize();
	long blockCount = sf.getBlockCount();
	long availCount = sf.getAvailableBlocks();
	Log.d("", "block大小:"+ blockSize+",block数目:"+ blockCount+",总大小:"+blockSize*blockCount/1024+"KB");
	Log.d("", "可用的block数目::"+ availCount+",可用大小:"+ availCount*blockSize/1024+"KB");
}

StatFs获取的都是以block为单位的,这里我解释一下block的概念:

1.硬件上的 block size, 应该是"sector size",linux的扇区大小是512byte

2.有文件系统的分区的block size, 是"block size",大小不一,可以用工具查看

3.没有文件系统的分区的block size,也叫“block size”,大小指的是1024 byte

4.Kernel buffer cache 的block size, 就是"block size",大部分PC是1024

5.磁盘分区的"cylinder size",用fdisk 可以查看。

我们这里的block size是第二种情况,一般SD卡都是fat32的文件系统,block size是4096.

这样就可以知道手机的内部存储空间和sd卡存储空间的总大小和可用大小了。