Android Rom分区 与 SD卡读写
2015-06-28 14:45
519 查看
1、Rom分区
在Android中,对数据的保护是很严密的。除了放在SD卡中的数据,一个应用所拥有的数据库、文件等内容都是不允许其他应用直接访问的,这一部分数据都是在/data/data里面。
这里所说的SD卡是逻辑上的SD卡,比如我现在用的galaxys4的Rom是16g,Android系统会把这16g分成两个部分,一个是系统和应用程序数据区,另一个就是虚拟的SD卡,可以称它为内置SD卡。
我们平时外插进手机的是TF卡,简称MicroSD卡,具体的可以参考百度。
三星手机默认的内置SD卡的挂载点是/storage/emulated/0.
android是基于linux的,linux里的要使用存储设备就要先把它挂载到到linux的目录树上(以/为根),android上一般是挂载到/storage/emulated/这个目录对应的目录或者/storage对应目录里的,假如你可以放两张内存卡,那些就可能是分别挂载到 /storage/emulated/0/ 和/storage/emulated/1/ 这样的目录。。而你得到/storage/emulated/0/是你SD卡的真正目录。。不是引用路径。以前你可能会得到的是/sdcard这样的路径。那个才是一个链接(你所说的引用),链接到你SD直正的挂载目录/storage/emulated/0 。。所以当你访问两个路径时得到的内容是一样的。
2、获取内置和外置SD卡路径
测试环境三星note3
需要权限
打印结果:
1.插入一张外置SD卡后
2.取出外置SD卡后
sdcard:
在现在的android手机中,由于有从rom划分出来的内置存储和可以插sd卡两个控件,所以就产生了/mnt/sdcard和/mnt/sdcard2.在按揉的提供的模拟器中是没有sdcard2这个目录的,原因在于模拟器并没有将rom划分出内部存储。
通过代码,获取内部空间的时候,发现不同的手机获取的方式各有不同:比如说我的华为手机,获取手机内部存储的时候,实际上获取的是/data分区的空间,而在有的手机获取的却是rom划分后剩余的空间(及被我们叫做内部存储的空间)
而获取sdcard空间的时候分两种情况:
1、手机没有插sd卡的时候,这时获取的总SD卡空间为rom被划分后剩余的内部存储空间
2、手机插上sd卡的时候,这时获取的总SD卡空间为外部sd卡的空间
3、SD卡读写
在Android中,对数据的保护是很严密的。除了放在SD卡中的数据,一个应用所拥有的数据库、文件等内容都是不允许其他应用直接访问的,这一部分数据都是在/data/data里面。
这里所说的SD卡是逻辑上的SD卡,比如我现在用的galaxys4的Rom是16g,Android系统会把这16g分成两个部分,一个是系统和应用程序数据区,另一个就是虚拟的SD卡,可以称它为内置SD卡。
我们平时外插进手机的是TF卡,简称MicroSD卡,具体的可以参考百度。
三星手机默认的内置SD卡的挂载点是/storage/emulated/0.
android是基于linux的,linux里的要使用存储设备就要先把它挂载到到linux的目录树上(以/为根),android上一般是挂载到/storage/emulated/这个目录对应的目录或者/storage对应目录里的,假如你可以放两张内存卡,那些就可能是分别挂载到 /storage/emulated/0/ 和/storage/emulated/1/ 这样的目录。。而你得到/storage/emulated/0/是你SD卡的真正目录。。不是引用路径。以前你可能会得到的是/sdcard这样的路径。那个才是一个链接(你所说的引用),链接到你SD直正的挂载目录/storage/emulated/0 。。所以当你访问两个路径时得到的内容是一样的。
2、获取内置和外置SD卡路径
测试环境三星note3
需要权限
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
importjava.io.BufferedReader; importjava.io.File; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.util.ArrayList; importjava.util.List; importandroid.os.Bundle; importandroid.os.Environment; importandroid.app.Activity; importandroid.view.Menu; publicclassMainActivityextendsActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StringBuilderlog=newStringBuilder(); StringinPath=getInnerSDCardPath(); log.append("内置SD卡路径:"+inPath+"\r\n"); List<string>extPaths=getExtSDCardPath(); for(Stringpath:extPaths){ log.append("外置SD卡路径:"+path+"\r\n"); } System.out.println(log.toString()); } /** *获取内置SD卡路径 *@return */ publicStringgetInnerSDCardPath(){ returnEnvironment.getExternalStorageDirectory().getPath(); } /** *获取外置SD卡路径 *@return应该就一条记录或空 */ publicList<string>getExtSDCardPath() { List<string>lResult=newArrayList<string>(); try{ Runtimert=Runtime.getRuntime(); Processproc=rt.exec("mount"); InputStreamis=proc.getInputStream(); InputStreamReaderisr=newInputStreamReader(is); BufferedReaderbr=newBufferedReader(isr); Stringline; while((line=br.readLine())!=null){ if(line.contains("extSdCard")) { String[]arr=line.split(""); Stringpath=arr[1]; Filefile=newFile(path); if(file.isDirectory()) { lResult.add(path); } } } isr.close(); }catch(Exceptione){ } returnlResult; } @Override publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.activity_main,menu); returntrue; } }
打印结果:
1.插入一张外置SD卡后
2.取出外置SD卡后
sdcard:
在现在的android手机中,由于有从rom划分出来的内置存储和可以插sd卡两个控件,所以就产生了/mnt/sdcard和/mnt/sdcard2.在按揉的提供的模拟器中是没有sdcard2这个目录的,原因在于模拟器并没有将rom划分出内部存储。
通过代码,获取内部空间的时候,发现不同的手机获取的方式各有不同:比如说我的华为手机,获取手机内部存储的时候,实际上获取的是/data分区的空间,而在有的手机获取的却是rom划分后剩余的空间(及被我们叫做内部存储的空间)
而获取sdcard空间的时候分两种情况:
1、手机没有插sd卡的时候,这时获取的总SD卡空间为rom被划分后剩余的内部存储空间
2、手机插上sd卡的时候,这时获取的总SD卡空间为外部sd卡的空间
3、SD卡读写
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importorg.apache.http.util.EncodingUtils;
importandroid.app.Activity;
publicclassFileAccess{
/**
*一、私有文件夹下的文件存取(/data/data/包名/files)
*
*@paramfileName
*@parammessage
*/
publicvoidwriteFileData(StringfileName,Stringmessage){
try{
FileOutputStreamfout=openFileOutput(fileName,MODE_PRIVATE);
byte[]bytes=message.getBytes();
fout.write(bytes);
fout.close();
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*//读文件在./data/data/包名/files/下面
*
*@paramfileName
*@return
*/
publicStringreadFileData(StringfileName){
Stringres="";
try{
FileInputStreamfin=openFileInput(fileName);
intlength=fin.available();
byte[]buffer=newbyte[length];
fin.read(buffer);
res=EncodingUtils.getString(buffer,"UTF-8");
fin.close();
}catch(Exceptione){
e.printStackTrace();
}
returnres;
}
/**
*写,读sdcard目录上的文件,要用FileOutputStream,不能用openFileOutput
*不同点:openFileOutput是在raw里编译过的,FileOutputStream是任何文件都可以
*@paramfileName
*@parammessage
*/
//写在/mnt/sdcard/目录下面的文件
publicvoidwriteFileSdcard(StringfileName,Stringmessage){
try{
//FileOutputStreamfout=openFileOutput(fileName,MODE_PRIVATE);
FileOutputStreamfout=newFileOutputStream(fileName);
byte[]bytes=message.getBytes();
fout.write(bytes);
fout.close();
}
catch(Exceptione){
e.printStackTrace();
}
}
//读在/mnt/sdcard/目录下面的文件
publicStringreadFileSdcard(StringfileName){
Stringres="";
try{
FileInputStreamfin=newFileInputStream(fileName);
intlength=fin.available();
byte[]buffer=newbyte[length];
fin.read(buffer);
res=EncodingUtils.getString(buffer,"UTF-8");
fin.close();
}
catch(Exceptione){
e.printStackTrace();
}
returnres;
}
/**
*二、从resource中的raw文件夹中获取文件并读取数据(资源文件只能读不能写)
*
*@paramfileInRaw
*@return
*/
publicStringreadFromRaw(intfileInRaw){
Stringres="";
try{
InputStreamin=getResources().openRawResource(fileInRaw);
intlength=in.available();
byte[]buffer=newbyte[length];
in.read(buffer);
res=EncodingUtils.getString(buffer,"GBK");
//res=newString(buffer,"GBK");
in.close();
}catch(Exceptione){
e.printStackTrace();
}
returnres;
}
/**
*三、从asset中获取文件并读取数据(资源文件只能读不能写)
*
*@paramfileName
*@return
*/
publicStringreadFromAsset(StringfileName){
Stringres="";
try{
InputStreamin=getResources().getAssets().open(fileName);
intlength=in.available();
byte[]buffer=newbyte[length];
in.read(buffer);
res=EncodingUtils.getString(buffer,"UTF-8");
}catch(Exceptione){
e.printStackTrace();
}
returnres;
}
}
相关文章推荐
- Mac下Android Studio subversion 集成的问题
- (原创)《Android编程权威指南》学习笔记01-- Android应用初体验--005
- Android 动画具体解释View动画
- Android(Lollipop/5.0) Material Design(六) 自定义动画
- <只看这个就够了。。。>Android自动化测试及性能优化
- Android中把时间戳转化为对应的时长
- Android 数据抓取——在线音乐播放器的实现
- android单元测试 activity跳转 以及 input 输入后 测试
- Mac OS 10.10.3 下 AndroidStudio单元测试
- 关于android sqlite数据库使用的几点心得
- 加快Android Studio的编译速度
- 迁移项目到Android Studio
- Android Studio的一些小技巧
- Android Studio中多项目共享Library
- android 监听来电 和 去电
- 探索新的Android Material Design支持库
- Android四大组件之内容提供者--ContentProvider
- Android Socket 通信实例...【Pnoker】
- android菜鸟学习笔记8----Activity(一)
- 关于 android 环信无法正确获取昵称的问题