Android正确获取SD卡目录及使用SD卡目录

此文乃是转载,原文在这里链接

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()  获取到下载的缓存目录

3:getExternalStorageDirectory()  获取到外部存储的目录 一般指SDcard

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();

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • permissionn.允许;批准,正式认可,认可user permission 使用权限permission D...
    lengol阅读 1,030评论 0 51
  • Environment相关用法 1、讲述 Environment 类 Environment 是一个提供访问环境变...
    babybus_hentai阅读 6,158评论 1 1
  • 吃喝拉撒是人的自然属性。先人们早就留下了“民以食为天”的古训,可见吃饭是一件天大的事儿。 农耕社会平头百姓最犯愁的...
    老吴所求阅读 614评论 17 15
  • 就在刚刚,睡不着无聊,打开Puff-iOS摆弄摆弄,然后就发现了这个- 整个页面没汉化不说,妈蛋label默认的文...
    spongebobsun阅读 427评论 0 0
  • 有一首歌好像就是这个名字吧,一时想不起来,于是在酷狗搜索栏里填上这四个字,分别听了李健和莫文蔚唱的,各自有各自的味...
    李梓妍Li阅读 396评论 0 0