转自:http://www.2cto.com/kf/201304/204729.html

关于android存储器简介:
                 android开发常常需要涉及数据缓存,这就需要我们了解手机当前使用的内存状况,是否存在外置存储卡,如果有怎么办,没有是否使用内置存储卡。
 
首先手机本机存储器,有Rom,Ram。
   Rom  :在android中Rom相当于系统盘,当C盘用 ,很多时候要使用需要获取root权限。
 
              一般可以分为机身内存和内置存储(三星的多是叫:USB存储器);
 
             机身内存包括system、data和cache等分区目录,软件默认都是安装机身内存或者内置存储卡里的 。
 
            data(就是手机储存总量)+system(手机系统占用)
 
                具体看是什么手机;
 
   Ram:在相当于电脑的运行内存,运存  。不多做解释,就是随机运行时内存,断电数据全部消失。
 
 
 
        外置存储器有:手机存储器 (TF卡), 相当于D,E ,F 等硬盘。
 
 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android开发中读取手机存储器和外置存储器。
 
 
Android读取手机内存之机身内存
这个我反复试验过,可以弄入以及读取数据到data目录下,但是需要获取root权限,这个真有点纠结,难道要使用**软件的人都去root下?。嘿嘿,所以这里不推荐,这里就不粘贴代码了........
 
 
Android读取手机内存之内置存储器实例
 
下面给出一个小例子来说明如何Android读取手机内存里的文件,这在Android开发中是比较重要的一部分,如何要是掌握不好的话,我们 就没法把数据库里保存的数据给读出来,也就是说我们我们每一次玩游戏的时候,我们的数据库都是最原始的数据,这样就会给我们带来很多的麻烦。如果出现这样 的事情,那么你的应用就是非常烂的,代码如下:
 
[java] view plaincopy
public static InputStream readInternalFileInputStream(Context context,String fileName){      
     
/**    
* 读取手机内存文件    
*    
*/      
    
try{      
FileInputStream fis = context.openFileInput(fileName);      
    
return fis;      
}catch(Exception e){      
return null;      
}      
    
}      
public static String readInternalFile(Context context,String fileName){      
    
    
/**    
* 读取手机内存文件    
*    
*/      
    
try{      
byte[] buffer = new byte[512];      
int read =0;      
StringBuffer stringbuffer = new StringBuffer();      
FileInputStream fis = context.openFileInput(fileName);      
    
do{      
read = fis.read(buffer);      
if(read>0)      
stringbuffer.append(new String(buffer, 0, read, "utf-8"));      
    
}while(read!=-1);      
    
fis.close();      
return stringbuffer.toString();      
}catch(Exception e){      
return null;      
}      
    
}     
 
外置内存
android 读取sd卡中的图片
 
一 读取sd卡中的图片
     1 获取读取sd的权限
        在AndroidMainfest.xml文件中添加
[java] view plaincopy
        <!-- 在SDCard中创建与删除文件权限 -->  
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></uses-permission>  
<!-- 往SDCard写入数据权限 -->  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>  
<uses-permission android:name="android.permission.RESTART_PACKAGES" ></uses-permission>  
 
    注意:在<application...></application>前添加
    2 找到sd卡的目录(以真机的情况说明)
 
 /**
      *图片文件路径
 *打印Environment.getExternalStorageDirectory()得到:"/mnt/sdcard",即找到了sd卡的根目录
      */
[java] view plaincopy
public String filePath=Environment.getExternalStorageDirectory()+"/client/tile/1_0_0.jpg";  
 
   3 根据路径获取图片    
[java] view plaincopy
File mfile=new File(path);  
if (mfile.exists()) {//若该文件存在  
Bitmap bm = BitmapFactory.decodeFile(path);  
return bm;  
}  
 
二 注意事项
    在读取sd卡中图片的过程中的一些可用判断
     1 Environment.getExternalStorageState()获取路径是否成功
       /*如获取成功,返回值为MEDIA_MOUNTED*/
 
 
[java] view plaincopy
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
 {  
  
      String filePath=Environment.getExternalStorageDirectory().getPath();  
 }  
 
   2 获取sd卡的权限成功
     /*fileName=Environment.getExternalStorageDirectory()+"/client" 是个文件夹目录*/
[java] view plaincopy
File f = new File(fileName);  
//可读  
if(f.canRead())  
Log.v("EagleTag","very bad");  
//可写  
if(f.canWrite())  
     Log.v("EagleTag","very good");  
 
 
 
--------------------------------------------------------------------------------------------------------------
 
 
 
 
 
 
android的data和system以及cache系统目录讲解
 
 
 
 
/system 存放的是rom的信息;
 
/system/app 存放rom本身附带的软件即系统软件;
 
/system/data 存放/system/app 中核心系统软件的数据文件信息。
 
 /data 存放的是用户的软件信息(非自带rom安装的软件);
 
/data/app 存放用户安装的软件;
 
/data/data 存放所有软件(包括/system/app 和 /data/app 和 /mnt/asec中装的软件)的一些lib和xml文件等数据信息;
 
/data/dalvik-cache 存放程序的缓存文件,这里的文件都是可以删除的。
 
 
 
 
/sdcard和/mnt/sdcard一样吗?/mnt/asce是干嘛用的?
 
我来谈谈/mnt/asce目录
1、android升级到2.2以上,出现了这个目录,这个目录是干什么的呢?
2、2.2以上,出现了新的功能,应用可以安装的sd卡上,哪到底安装在哪儿呢?我找遍了整个卡结果发现了所有这些应用安装在.android 的asecure目录下,要把卡放到读卡器上去看才知道。
3、那是如何与系统发生关系的,学过unix的人都知道,mnt是在/下的一个目录,sd卡是通过mount挂接上去的,/mnt叫挂接点,系统就能通过挂接点/mnt访问sd卡了
4、在/mnt下有三个目录如下:asec、secure、sdcard 其中asec就是我们安装在卡上的应用、secure是用于sd卡应用程序安装路径加密的吧自己猜想的、sdcard就是卡上的其他内容。
 
 
/mnt/asce实际上对应的真正物理目录是/mnt/sdcard/.android_secure(记住android_secure前有个点,这是个隐藏目录)
 
 
我们回过来看/sdcard和/mnt/sdcard就容易理解:
 
/sdcard 目录,这是一个软链接(相当于windows的文件夹的快捷方式),链接到/mnt/sdcard 目录,即这个目录的内容就是sdcard的内容。
 
 
   因此,用户程序安装到到sd卡上后,其内容可能分散到:/mnt/asec , /mnt/secure , /data/data 。
 
    要实现app2sd,目前比较流行有两种方案,分别是app2ext 和 data2ext,下面分别介绍下这2种方案。
 
    app2ext的原理是,删除data区中的app文件夹,然后在sd卡的ext分区上创建一个app文件,并通过软链接映射到data区。这样系统会以 为,app这个软链接是一个真实的文件夹,会把程序都安装在里面,但实际上,这些程序都安装到卡上了。但由于操作系统并不知道,所以这种情况下,我们依然 看到系统显示这个程序是安装在“内置空间”的。
    data2ext则更彻底,它不是用软链接,而是直接用“挂载”功能,Linux下所有的存储设备都必须挂载成一个文件夹才能进行文件操作(如sd卡就挂 载在/mnt/sdcard目录下面)。data文件夹本来是对应手机内部Flash中的一个分区(为了保持术语的准确,这里要把内部Flash和内存相 区别,内部Flash是ROM,内存是RAM)。而data2ext则是修改了挂载对应关系,使data文件夹挂载的不是内置Flash,而是sd卡的整 个ext分区。这样,不仅是app,连存储程序设置的data和缓存dalvik-cache都会存储到sd卡中。
 
    可以看到,dalvik-cache和data这两个文件夹的位置,是这两种方式的一个重大区别。其中dalvik-cache是虚拟机预 编译缓存,data(不同于/data,这个是/data/data)是存储程序数据的地方,例如游戏的存档记录,软件的配置信息等。这样有什么区别,区 别在于假如你重刷了ROM,app2ext的话,所有的程序都可以保留,但是这些程序的配置信息和游戏的存档都会丢失。而data2ext则可以连同配置 和存档都保留,但是dalvik-cache也是一个容易积累垃圾的地方,这些垃圾也会一同保留。
 
 
    data2ext由于是把整个data分区都放在sd卡上,因此,我们刷ROM需要WIPE的时候,这个data分区的内容就可能不会被wipe,这可以保存用户的个人资料,但是也可能造成系统莫名其妙的故障。

android开发关于和使用本机内存、内置存储卡和外置存储卡 (转)的更多相关文章

  1. Android开发优化之——对Bitmap的内存优化

    http://blog.csdn.net/arui319/article/details/7953690 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitm ...

  2. Android获取内置sdcard跟外置sdcard路径

    Android获取内置sdcard跟外置sdcard路径.(测试过两个手机,亲测可用) 1.先得到外置sdcard路径,这个接口是系统提供的标准接口. 2.得到上一级文件夹目录 3.得到该目录的所有文 ...

  3. macbook Android开发环境搭建,真机调试

    买了一台MacBook,本以为可以鼓捣一下iOS开发之类的,可惜导师要我做Android开发.无奈开始了在MacBook上开发Android的工作. 从开始配置环境到应用成功在真机上运行,也是曲曲折折 ...

  4. Android动态换肤(一、应用内置多套皮肤)

    动态换肤在很多android应用中都有使用,用户根据自己的喜好设置皮肤主题,可以增强用户使用应用的舒适度. Android换肤可以分为很多种,它们从使用方式,用户体验以及项目框架设计上体现了明显的差异 ...

  5. DoNet屌丝学Android(一)——Android开发准备工作 & No HelloWord & (真机)调试

    先乱扯淡一下吧,本人一.net屌丝,手持Android 4.2.2手机,Win7 x64本本,闲来无聊学习一下Android的开发,至于要开发啥玩意目前没有什么想法,就是想学学,搞不好是三分热度也有可 ...

  6. 解析Android开发优化之:对Bitmap的内存优化详解

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  7. (转)Android开发:性能最佳实践-管理应用内存

    翻自:http://developer.android.com/training/articles/memory.html 在任何软件开发环境中,RAM都是宝贵的资源,但在移动操作系统中更加珍贵.尽管 ...

  8. 转:Android开发:使用DDMS Heap进行内存泄露调试

    无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中的DDMS就带有一个很不错的内存监测工具Heap,本 ...

  9. Android开发之蓝牙 --修改本机蓝牙设备的可见性,并扫描周围可用的蓝牙设备

    一. 修改本机蓝牙设备的可见性 二. 扫描周围可用的蓝牙设备 一.  清单文件AdroidManifest.xml: <uses-permission android:name="an ...

随机推荐

  1. linux之SQL语句简明教程---表格连接

    现在我们介绍连接 (Join) 的概念.要了解连接,我们需要用到许多我们之前已介绍过的指令.我们先假设我们有以下的两个表格, Store_Information 表格 Store_Name Sales ...

  2. linux之SQL语句简明教程---DISTINCT

    SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料.这将把所有的资料都抓出,无论资料值有无重复.在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况.换句话说,我们需要知道这个表格 ...

  3. 关于VMware导入Linux VM找不到网卡的问题

    今天遇到一个问题:由于虚拟机升级,导致以前的Linux VM(CentoS 6.7)在新的VMware里面打开,系统提示找不到网卡的问题,在网上找了好多解决办法,基本上都是一样的答案. 与网卡有关的几 ...

  4. C#中静态与非静态方法比较【转】

    C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向你做一下解析. C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他们在使用 ...

  5. 使用HTML5/CSS3制作便签贴

    利用HTML5/CSS3,仅用5步就可以制作便签贴效果的HTML页面,效果图如下: (注:图里的文字纯属杜撰,搞笑目的,如有雷同,纯属巧合,谢谢!) 注:该效果可以在Safari, Chrome,Fi ...

  6. Linux下卸载ORACLE的多种方法(转)

    第一种# cd /u01/app/oracle/product/11.2.0/client_1/deinstall/ # ./deinstall# rm -rf /u01/app/oracle# rm ...

  7. LeetCode Day4——Factorial Trailing Zeroes

    /* * Problem 172: Factorial Trailing Zeroes * Given an integer n, return the number of trailing zero ...

  8. js糟粕

    正在看<javascript语言精粹>,遇到明显的特点就记录下来,以防看了白看(噗噗~) 为了不误导,形成错误印象,文中 ‘错误设计‘ 写成 ‘现有设计’,’正确设计‘ 写成 ’期待设计‘ ...

  9. zoj1025 Wooden Sticks

    DAG转移,从切题的数量来看是一道水题,给你n个棒,大的可以延续小的,问最少上升子序列的个数. 其实这道题是用贪心来写的,因为这是个有向无环图,到达分叉口,每一条路都要便历,所以每条路应该一样对待,有 ...

  10. C++中的namespace

    本文转载来自:http://blog.csdn.net/yao_zhuang/article/details/1853625 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全 ...