您的位置:首页 > 移动开发 > Android开发

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

  需要权限

<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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: