此文乃是转载,原文在这里链接
SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?
1、判断手机是否插入SD卡
Java代码
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
doSth();
//....
}
2、然后才能操作SD卡
File path = Environment.getExternalStorageDirectory();
这个PATH就是你要操作的路径,当然你在操作的时候最好对SD卡的使用做个检测判断,当SD卡有存储空间时才可以进行存储操作。
StatFs statfs =newStatFs(path.getPath());
获取BLOCK的SIZE
longblocSize = statfs.getBlockSize();
获取BLOCK数量
longtotalBlocks = statfs.getBlockCount()
空闲的Block的数量
longavailaBlock = statfs.getAvailableBlocks();
最后别忘了,要获取SD卡上面的信息,必须先对SD卡有访问的权限,因此最后一件事就是需要添加访问扩展设备的权限,更多权限请访问:Android 应用程序开发权限一览表。
XML/HTML代码
android:name="android.permission.WRITE_EXTERNAL_STORAGE">
2、获得SD卡目录
sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录
3、写入文件
File f = Environment.getExternalStorageDirectory();//获取SD卡目录
File fileDir =newFile(f,"test.txt");
FileOutputStream os =newFileOutputStream(fileDir);
try{
os.write(text.getBytes());
os.close();
showToast("保存到SD卡中");
}catch(IOException
e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
4、读取文件
File f = Environment.getExternalStorageDirectory();//获取SD卡目录
File fileDir =newFile(f,"test.txt");
is =newFileInputStream(fileDir);
ByteArrayOutputStream bos =newByteArrayOutputStream();
byte[] array =newbyte[1024];
intlen = -1;
while(
(len = is.read(array)) != -1){
bos.write(array,0,len);
}
bos.close();
is.close();
returnbos.toString();
5、读取权限
在AndroidManifest.xml中加入访问SDCard的权限如下:
要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
6、其它方法
getCacheDir()方法用于获取/data/data//cache目录。
getFilesDir()方法用于获取/data/data//files目录。
其实就是普通的文件操作,不过还是有些地方需要注意。比如:
1.加入sdcard操作权限;
2.确认sdcard的存在;
3.不能直接在非sdcard的根目录创建文件,而是需要先创建目录,再创建文件;
在AndroidManifest.xml添加sdcard操作权限
变量声明:
private final static String PATH = "/sdcard/digu";
private final static String FILENAME = "/notes.txt";
向sdcard写文件
/**
* 写文件
*/
private void onWrite() {
try {
Log.d(LOG_TAG, "Start Write");
//1.判断是否存在sdcard
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
//目录
File path = new File(PATH);
//文件
File f = new File(PATH + FILENAME);
if(!path.exists()){
//2.创建目录,可以在应用启动的时候创建
path.mkdirs();
}
if (!f.exists()) {
//3.创建文件
f.createNewFile();
}
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream(f));
//4.写文件,从EditView获得文本值
osw.write(editor.getText().toString());
osw.close();
}
} catch (Exception e) {
Log.d(LOG_TAG, "file create error");
}
}
接着我们在使用SDcard进行读写的时候 会用到Environment类下面的几个静态方法
1: getDataDirectory() 获取到Androi中的data数据目录
2:getDownloadCacheDirectory() 获取到下载的缓存目录
4:getExternalStorageState() 获取外部设置的当前状态 一般指SDcard,
android系统中对于外部设置的状态,我们比较常用的应该是MEDIA_MOUNTED(SDcard存在并且可以进行读写)MEDIA_MOUNTED_READ_ONLY(SDcard存在,只可以进行读操作) 当然还有其他的一些状态,可以在文档中进行查找到
5:getRootDirectory() 获取到Android Root路径
6:isExternalStorageEmulated() 返回Boolean值判断外部设置是否有效
7:isExternalStorageRemovable() 返回Boolean值,判断外部设置是否可以移除
【注】上面进行红色标记的方法,我们会常用
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 代码中这句:我们对SDcard的状态进行判断,
下面看实现SDCard进行文件读写操作的Demo:
packagecom.jiangqq.sdcard;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
publicclassSDcardActivityextendsActivity {
privateButton bt1, bt2;
privateEditText et1, et2;
privatestaticfinalString FILENAME = "temp_file.txt";
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt1 = (Button)this.findViewById(R.id.bt1);
bt2 = (Button)this.findViewById(R.id.bt2);
et1 = (EditText)this.findViewById(R.id.et1);
et2 = (EditText)this.findViewById(R.id.et2);
bt1.setOnClickListener(newMySetOnClickListener());
bt2.setOnClickListener(newMySetOnClickListener());
}
privateclassMySetOnClickListenerimplementsOnClickListener {
@Override
publicvoidonClick(View v) {
File file =newFile(Environment.getExternalStorageDirectory(),
FILENAME);
switch(v.getId()) {
caseR.id.bt1://使用SDcard写操作
if(Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
try{
FileOutputStream fos =newFileOutputStream(file);
fos.write(et1.getText().toString().getBytes());
fos.close();
Toast.makeText(SDcardActivity.this, "写入文件成功",
Toast.LENGTH_LONG).show();
}catch(Exception e) {
Toast.makeText(SDcardActivity.this, "写入文件失败",
Toast.LENGTH_SHORT).show();
}