android 读写SD卡文件

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

 SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?

        1、判断手机是否插入SD卡

Java代码
  1. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  2.         doSth();  
  3.         //....
  4. }  

        2、然后才能操作SD卡

Java代码
  1. File path = Environment.getExternalStorageDirectory();   

        这个PATH就是你要操作的路径,当然你在操作的时候最好对SD卡的使用做个检测判断,当SD卡有存储空间时才可以进行存储操作。

Java代码
  1. StatFs statfs = new StatFs(path.getPath());  

        获取BLOCK的SIZE

Java代码
  1. long blocSize = statfs.getBlockSize();  

        获取BLOCK数量

Java代码
  1. long totalBlocks = statfs.getBlockCount();  

        空闲的Block的数量

Java代码
  1. long availaBlock = statfs.getAvailableBlocks();  

        最后别忘了,要获取SD卡上面的信息,必须先对SD卡有访问的权限,因此最后一件事就是需要添加访问扩展设备的权限,更多权限请访问:Android 应用程序开发权限一览表

XML/HTML代码
  1. <uses-permission   
  2.         android:name="android.permission.WRITE_EXTERNAL_STORAGE">  
  3. </uses-permission>  



2、获得SD卡目录

1 File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录

3、写入文件

01 File f = Environment.getExternalStorageDirectory();//获取SD卡目录
02 File fileDir = new File(f,"test.txt");
03 FileOutputStream os = new FileOutputStream(fileDir);
04 try {
05     os.write(text.getBytes());
06     os.close();
07     showToast("保存到SD卡中");
08 catch (IOException e) {
09     // TODO Auto-generated catch block
10     e.printStackTrace();
11 }

4、读取文件

01 File f = Environment.getExternalStorageDirectory();//获取SD卡目录
02                 File fileDir = new File(f,"test.txt");
03                 is = new FileInputStream(fileDir);
04 ByteArrayOutputStream bos = new ByteArrayOutputStream();
05                 byte[] array = new byte[1024];
06                 int len = -1;
07                 while( (len = is.read(array)) != -1){
08                     bos.write(array,0,len);
09                 }
10                 bos.close();
11                 is.close();
12                 return bos.toString();

5、读取权限

        在AndroidManifest.xml中加入访问SDCard的权限如下:

<!-- 在SDCard中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 往SDCard写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。

6、其它方法

    getCacheDir()方法用于获取/data/data/<package name>/cache目录。

    getFilesDir()方法用于获取/data/data/<package name>/files目录。


其实就是普通的文件操作,不过还是有些地方需要注意。比如:

  1.加入sdcard操作权限;
  2.确认sdcard的存在;
  3.不能直接在非sdcard的根目录创建文件,而是需要先创建目录,再创建文件;

  在AndroidManifest.xml添加sdcard操作权限
  <!-- sdcard权限 --> 
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
  </uses-permission>

  变量声明:
  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的状态进行判断,</span style="color:#ff0000;">

下面看实现SDCard进行文件读写操作的Demo:

package com.jiangqq.sdcard;

import  java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import  android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public  class SDcardActivity  extends Activity {
     private Button bt1, bt2;
     private EditText et1, et2;

     private  static  final String FILENAME = "temp_file.txt";

    @Override
     public  void onCreate(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( new MySetOnClickListener());
        bt2.setOnClickListener( new MySetOnClickListener());
    }

     private  class MySetOnClickListener  implements OnClickListener {

        @Override
         public  void onClick(View v) {
            File file =  new File(Environment.getExternalStorageDirectory(),
                    FILENAME);
             switch (v.getId()) {
             case R.id.bt1: //  使用SDcard写操作
                 if (Environment.getExternalStorageState().equals(
                        Environment.MEDIA_MOUNTED)) {

                     try {
                        FileOutputStream fos =  new FileOutputStream(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();
                    }



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值