Android系统的存储设备一般分为RAM,ROM,SDCard三个部分。其中RAM是Random Access Memory的缩写,是随机存储器,在工作状态时可以随机读写数据,断电以后会丢失数据,即我们常说的内存。手机的ROM和传统的ROM(Read Only Memory)又有些不一样,它分为两部分,一部分是用于系统,另外一部分是用作用户存储数据。SDCard即为我们平时所说的存储卡,8G,16G等,常用的有TF卡,用于存储用户数据。

在Android系统中存储设备信息在开发中随处可见,这里将开发中获取这些存储设备信息的方法进行总结。

一、内存(RAM)信息获取:

android的总内存大小信息存放在系统的/proc/meminfo文件里面,可以通过读取这个文件来获取这些信息:

[java] view plaincopy
  1. public void getMemoryInfo() {
  2. String str1 = "/proc/meminfo";
  3. String str2="";
  4. try {
  5. FileReader fr = new FileReader(str1);
  6. BufferedReader localBufferedReader = new BufferedReader(fr, 8192);
  7. while ((str2 = localBufferedReader.readLine()) != null) {
  8. Log.d(TAG, "---" + str2);
  9. }
  10. } catch (IOException e) {
  11. }
  12. }

运行信息如下:

[html] view plaincopy
  1. 08-02 15:29:06.962: D/StorgeState(15471): ---MemTotal:         516452 kB
  2. 08-02 15:29:06.972: D/StorgeState(15471): ---MemFree:          255280 kB
  3. 08-02 15:29:06.972: D/StorgeState(15471): ---Buffers:            1056 kB
  4. 08-02 15:29:06.982: D/StorgeState(15471): ---Cached:           106184 kB
  5. 08-02 15:29:06.982: D/StorgeState(15471): ---SwapCached:            0 kB
  6. 08-02 15:29:06.982: D/StorgeState(15471): ---Active:           178084 kB
  7. 08-02 15:29:06.982: D/StorgeState(15471): ---Inactive:          63172 kB
  8. 08-02 15:29:06.992: D/StorgeState(15471): ---Active(anon):     146004 kB
  9. 08-02 15:29:06.992: D/StorgeState(15471): ---Inactive(anon):        0 kB
  10. 08-02 15:29:07.002: D/StorgeState(15471): ---Active(file):      32080 kB
  11. 08-02 15:29:07.002: D/StorgeState(15471): ---Inactive(file):    63172 kB
  12. 08-02 15:29:07.002: D/StorgeState(15471): ---Unevictable:           0 kB
  13. 08-02 15:29:07.002: D/StorgeState(15471): ---Mlocked:               0 kB
  14. 08-02 15:29:07.002: D/StorgeState(15471): ---SwapTotal:             0 kB
  15. 08-02 15:29:07.002: D/StorgeState(15471): ---SwapFree:              0 kB
  16. 08-02 15:29:07.002: D/StorgeState(15471): ---Dirty:                 0 kB
  17. 08-02 15:29:07.014: D/StorgeState(15471): ---Writeback:             0 kB
  18. 08-02 15:29:07.014: D/StorgeState(15471): ---AnonPages:        134040 kB
  19. 08-02 15:29:07.014: D/StorgeState(15471): ---Mapped:            46600 kB
  20. 08-02 15:29:07.014: D/StorgeState(15471): ---Slab:               5532 kB
  21. 08-02 15:29:07.014: D/StorgeState(15471): ---SReclaimable:       2212 kB
  22. 08-02 15:29:07.022: D/StorgeState(15471): ---SUnreclaim:         3320 kB
  23. 08-02 15:29:07.022: D/StorgeState(15471): ---PageTables:         7356 kB
  24. 08-02 15:29:07.032: D/StorgeState(15471): ---NFS_Unstable:          0 kB
  25. 08-02 15:29:07.032: D/StorgeState(15471): ---Bounce:                0 kB
  26. 08-02 15:29:07.032: D/StorgeState(15471): ---WritebackTmp:          0 kB
  27. 08-02 15:29:07.032: D/StorgeState(15471): ---CommitLimit:      258224 kB
  28. 08-02 15:29:07.032: D/StorgeState(15471): ---Committed_AS:    1199832 kB
  29. 08-02 15:29:07.032: D/StorgeState(15471): ---VmallocTotal:     450560 kB
  30. 08-02 15:29:07.032: D/StorgeState(15471): ---VmallocUsed:       23616 kB
  31. 08-02 15:29:07.042: D/StorgeState(15471): ---VmallocChunk:     403460 kB

根据每一项的名称,很容易理解所对应的信息。

我们通过查看“/proc/meminfo”内容获取更内存的详细信息。有时候我们只是需要知道还有多少可用内存就不需要读取出如此多的内存信息,通过读取“/proc/meminfo”要把数据分离出来还是相当麻烦的,在这种情况下,我们可以通过Android系统提供的ActivityManager对象获取其可用的内存。

获取当前剩余内存(ram)大小的方法:

[java] view plaincopy
  1. /**
  2. * 获取可用手机内存(RAM)
  3. * @return
  4. */
  5. public static long getAvailMemory(Context context) {
  6. ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
  7. ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
  8. am.getMemoryInfo(mi);
  9. return mi.availMem;
  10. }

二、ROM信息获取

[java] view plaincopy
  1. /**
  2. * 获取手机内部空间大小
  3. * @return
  4. */
  5. public static long getTotalInternalStorgeSize() {
  6. File path = Environment.getDataDirectory();
  7. StatFs mStatFs = new StatFs(path.getPath());
  8. long blockSize = mStatFs.getBlockSize();
  9. long totalBlocks = mStatFs.getBlockCount();
  10. return totalBlocks * blockSize;
  11. }
  12. /**
  13. * 获取手机内部可用空间大小
  14. * @return
  15. */
  16. public static long getAvailableInternalStorgeSize() {
  17. File path = Environment.getDataDirectory();
  18. StatFs mStatFs = new StatFs(path.getPath());
  19. long blockSize = mStatFs.getBlockSize();
  20. long availableBlocks = mStatFs.getAvailableBlocks();
  21. return availableBlocks * blockSize;
  22. }

说明:

1、 注意类型,不然相乘之后会有溢出。

2、 内部存储(ROM )的信息要通过getDataDirectory()取得。

三、存储卡(SDCard)信息获取

[java] view plaincopy
  1. /**
  2. * 获取手机外部空间大小
  3. * @return
  4. */
  5. public static long getTotalExternalStorgeSize() {
  6. if (externalMemoryAvailable()) {
  7. File path = Environment.getExternalStorageDirectory();
  8. StatFs mStatFs = new StatFs(path.getPath());
  9. long blockSize = mStatFs.getBlockSize();
  10. long totalBlocks = mStatFs.getBlockCount();
  11. return totalBlocks * blockSize;
  12. } else {
  13. return ERROR;
  14. }
  15. }
  16. /**
  17. * 获取手机外部可用空间大小
  18. * @return
  19. */
  20. public static long getAvailableExternalStorgeSize() {
  21. if (externalMemoryAvailable()) {
  22. File path = Environment.getExternalStorageDirectory();
  23. StatFs mStatFs = new StatFs(path.getPath());
  24. long blockSize = mStatFs.getBlockSize();
  25. long availableBlocks = mStatFs.getAvailableBlocks();
  26. return availableBlocks * blockSize;
  27. } else {
  28. return ERROR;
  29. }
  30. }

说明:注意类型,不然相乘之后会有溢出。

四、两个工具

通过获取存储信息读出来存储空间大小数据单位是Bit,看起来并不直观和人性化,因此需要对这些数据进行格式化。格式化数据方法如下:

[java] view plaincopy
  1. /* 返回为字符串数组[0]为大小[1]为单位KB或MB */
  2. public static String formatSize(long size) {
  3. String suffix = "";
  4. float fSzie = 0;
  5. if (size >= 1024) {
  6. suffix = "KB";
  7. fSzie = size / 1024;
  8. if (fSzie >= 1024) {
  9. suffix = "MB";
  10. fSzie /= 1024;
  11. if (fSzie >= 1024) {
  12. suffix = "GB";
  13. fSzie /= 1024;
  14. }
  15. }
  16. }
  17. DecimalFormat formatter = new DecimalFormat("#0.00");// 字符显示格式
  18. /* 每3个数字用,分隔,如1,000 */
  19. formatter.setGroupingSize(3);
  20. StringBuilder resultBuffer = new StringBuilder(formatter.format(fSzie));
  21. if (suffix != null) {
  22. resultBuffer.append(suffix);
  23. }
  24. return resultBuffer.toString();
  25. }

另外一个工具:判断外部存储(SDCard)是否可用方法:

[java] view plaincopy
  1. /**
  2. * 外部存储(SDCard)是否可用
  3. * @return
  4. */
  5. public static boolean externalMemoryAvailable() {
  6. return android.os.Environment.getExternalStorageState().equals(
  7. android.os.Environment.MEDIA_MOUNTED);
  8. }

五、小结:

这里所有的方法都使用了static进行声明,原因是获取系统这些信息的方法是固定而且是比较常用的。我是单独把这些方法分类作为工具类进行了整理。以备以后使用,而不用每次都要去重新写这些方法,虽然花费不了多少时间,但是良好的习惯是提高效率的很重要一环。

Android系统信息获取 之一:系统存储信息的获取(RAM,ROM,SDCard)相关推荐

  1. 获取Java系统相关信息

    1 package com.test; 2 3 import java.util.Properties; 4 import java.util.Map.Entry; 5 6 import org.ju ...

  2. js解密之QQ的bkn值,获取QQ群成员信息,获取QQ好友列表信息

    js解密之QQ的bkn值,获取QQ群成员信息,获取QQ好友列表信息   Lan   2020-05-31 12:13   126 人阅读  0 条评论 QQ群网站:https://qun.qq.com ...

  3. android 大文本存储,Android操作文件存储信息 利用SharedReference存储信息(获取SDCARD大小)...

    1.机身内存 package com.pas.loginservice; import java.io.BufferedReader; import java.io.File; import java ...

  4. 安卓 linux找回内置存储,Android手机自带内部存储路径的获取

    我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro ...

  5. iOS获取iPhone系统等信息和服务器返回空的异常处理

    前言: 在项目中经常会遇到需要获取系统的信息来处理一些特殊的需求和服务端返回为空的处理,写在这里只是笔记一下. 获取设备的信息 NSLog(@"globallyUniqueString=%@ ...

  6. 通过sysinfo获取Linux系统状态信息

      系统运行状态信息是我们关注的重点,通过当前系统的输出信息,如内存大小.进程数量.运行时间等,以便分析CPU负载.软硬件资源占用情况,确保系统高效和稳定.Linux系统中,提供sysinfo以获取相 ...

  7. 动态ram依靠什么存储信息_ROM、RAM、DRAM、SRAM和FLASH傻傻分不清

    ROM.RAM.DRAM.SRAM和FLASH各类储存器在电脑.手机.电子设备.嵌入式设备及相应的开发中普遍应用的,但是很多还是傻傻分不清楚.下面就简单介绍下这几个吧! ROM和RAM ROM:只读存 ...

  8. python获取服务器系统时间,Python datetime获取详细时间

    说明:datetime是date和time的结合体,包含了date和time的所有信息 datetime常见用法: 1.datetime.datetime.now()返回一个UTC时间的datetim ...

  9. 获取小程序用户信息+java_java获取微信小程序用户信息

    第一步:获取openid.session_key等信息. /** * 获取微信小程序的用户openid和session_key/unionid * 返回格式:{"session_key&qu ...

最新文章

  1. 2019-2020-3 《Java 程序设计》第三周知识总结
  2. 网络服务之DNS基本应用
  3. 语义分割 - 数据集准备
  4. eclipse远程连接Hadoop,用户认证失败
  5. CodePush 管理工具 App Center Cli 的常用命令行
  6. 如何在SAP Kyma的控制台里扩展新的UI
  7. 终极Java日志字典:开发人员最常记录的单词是什么?
  8. [剑指offer]面试题第[63]题[Leetcode][第121题][JAVA][买卖股票的最佳时机][动态规划][暴力]
  9. 【CCF】 201604-1折点计数
  10. 用calloc()函数分配内存
  11. 机器学习之使用sklearn构造决策树模型
  12. 7. 开启 mysql remote access
  13. Go 环境变量、go env
  14. 网络游戏是怎样登录的?
  15. netty 给指定用户推送消息_Netty实战:设计一个IM框架就这么简单!
  16. 【数字IC前端笔试真题精刷(2022.8.14)】大疆——数字芯片开发工程师B卷
  17. zblog php 点赞,zblog文章下面添加点赞等表情的方法(使用畅言实验室)
  18. 教授专栏37 | 黄昊: 发展虚拟资产, 须监管教育并行
  19. 使用 Vue 和 Electron 开发一款简单的 Markdown 编辑器
  20. Linux基础命令----tailf 跟踪文件输出

热门文章

  1. js中substr,substring,indexOf,lastIndexOf的用法小结
  2. 运行python manage.py runserver报错现象、原因和解决办法
  3. 20款免费响应式的 HTML5 网站模板下载
  4. 15款最佳的 jQuery 分步引导插件
  5. 乔治华盛顿计算机科学,乔治华盛顿大学计算机科学
  6. 计算机验收标准和验收方法,【超详细】综合布线系统验收标准及内容
  7. sudo: add-apt-repository:找不到命令_C++腾讯面试题库干货!作为程序员,这些都掌握了,还有什么理由拿不到offer?...
  8. vb 打开sdf数据_DWG、DGN、SDF、DWF!Civil 3D图形数据共享的几种方法
  9. python编程语言继承_如何使用Python继承机制(子类化内置类型)
  10. hash算法_HASH算法简介