上一节我们学习了Android的数据存储采用File,但是这样的数据是存储在应用程序内的,那么也就是说这样的存储的文件大小还是有一定要限制的,有时候我们需要存储更大的文件,比如电影等,这就用到了我们的SDSard存储卡。Android也为我们提供了SDCard的一些相关操作。Environment这个类就可以实现这个功能。

Environmet类

常用常量

String MEDIA_MOUNTED

当前Android的外部存储器可读可写

String MEDIA_MOUNTED_READ_ONLY

当前Android的外部存储器只读

常用方法

方法名称

描述

public static File getDataDirectory ()

获得Android下的data文件夹的目录

public static File getDownloadCacheDirectory ()

获得Android Download/Cache 内容的目录

public static File getExternalStorageDirectory ()

获得Android外部存储器也就是SDCard的目录

public static String getExternalStorageState ()

获得Android外部存储器的当前状态

public static File getRootDirectory ()

获得Android下的root文件夹的目录

要想实现对SDCard的读取操作,只需要按以下几个步骤就行:

1、 先判断这台手机设备上是否有SDCard且具有读写SDCard的权限

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

2、 调用Environment.getExternalStorageDirectory()获得到外部存储器的目录

3、 使用IO流对外部存储器进行文件的读写

4、 别忘记了要在AndroidMainfest.xml中添加权限哦

特别声明:以下操作必须要在如下权限下完成:

[html] view plain copy print ?
  1. <!--在SDCard中创建与删除文件权限-->
  2. <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  3. <!--往SDCard中写入数据权限-->
  4. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


实例:读写SDCard上的文件

[java] view plain copy print ?
  1. packagecom.jiahui.sdcarddemo;
  2. importjava.io.File;
  3. importjava.io.FileInputStream;
  4. importjava.io.FileNotFoundException;
  5. importjava.io.FileOutputStream;
  6. importjava.io.IOException;
  7. importjava.io.InputStream;
  8. importjava.io.OutputStream;
  9. importjava.io.RandomAccessFile;
  10. importandroid.app.Activity;
  11. importandroid.os.Bundle;
  12. importandroid.os.Environment;
  13. importandroid.view.View;
  14. importandroid.widget.Button;
  15. importandroid.widget.EditText;
  16. importandroid.widget.TextView;
  17. publicclassSDCardDemoActivityextendsActivity{
  18. privateButtonbtnWrite,btnRead;
  19. privateEditTextedtContent;
  20. privateTextViewtvResult;
  21. privatestaticfinalStringFILE_NAME="test.txt";
  22. publicvoidonCreate(BundlesavedInstanceState){
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.main);
  25. edtContent=(EditText)this.findViewById(R.id.edtContent);
  26. tvResult=(TextView)this.findViewById(R.id.tvResult);
  27. btnRead=(Button)this.findViewById(R.id.btnRead);
  28. btnWrite=(Button)this.findViewById(R.id.btnWrite);
  29. btnWrite.setOnClickListener(newView.OnClickListener(){
  30. @Override
  31. publicvoidonClick(Viewv){
  32. System.out.println("往SDCard里写数据");
  33. //先判断是否有SDCard
  34. System.out.println("Environment.getExternalStorageState():"
  35. +Environment.getExternalStorageState());
  36. System.out.println("Environment.MEDIA_MOUNTED:"
  37. +Environment.MEDIA_MOUNTED);
  38. if(Environment.getExternalStorageState().equals(
  39. Environment.MEDIA_MOUNTED)){
  40. Stringcontent=edtContent.getText().toString();
  41. try{
  42. //获取SDcard路径
  43. FilesdCardDir=Environment
  44. .getExternalStorageDirectory();
  45. //SDCard目录:/mnt/sdcard
  46. StringsdcardPath=sdCardDir.getAbsolutePath();
  47. System.out.println("sdCardDir.getAbsolutePath()"
  48. +sdCardDir.getAbsolutePath());
  49. Filefile=newFile(sdCardDir,FILE_NAME);
  50. //Filefile=newFile(sdcardPath
  51. //+File.separator+FILE_NAME);
  52. //以指定文件创建RandomAccessFile对象
  53. RandomAccessFileraf=newRandomAccessFile(file,"rw");
  54. //将文件记录指针移动最后
  55. raf.seek(file.length());
  56. //输出文件内容
  57. raf.write(content.getBytes());
  58. raf.close();
  59. }catch(Exceptione){
  60. //TODO:handleexception
  61. }
  62. }
  63. }
  64. });
  65. btnRead.setOnClickListener(newView.OnClickListener(){
  66. @Override
  67. publicvoidonClick(Viewv){
  68. if(Environment.getExternalStorageState().equals(
  69. Environment.MEDIA_MOUNTED)){
  70. //获取SDcard路径
  71. StringBuildersb=newStringBuilder();
  72. try{
  73. FilesdCardDir=Environment
  74. .getExternalStorageDirectory();
  75. Filefile=newFile(sdCardDir,FILE_NAME);
  76. InputStreaminputStream=newFileInputStream(file);
  77. intlen=0;
  78. byte[]buffer=newbyte[1024];
  79. while((len=inputStream.read(buffer))!=-1){
  80. sb.append(newString(buffer,0,len));
  81. }
  82. tvResult.setText(sb.toString());
  83. //关闭流
  84. inputStream.close();
  85. }catch(Exceptione){
  86. //TODOAuto-generatedcatchblock
  87. e.printStackTrace();
  88. }
  89. }
  90. }
  91. });
  92. }
  93. }


实现效果

用File Explorer可以看到如下图一样的效果:

开发注意事项:

1、 一定不能忘记添加权限

[html] view plain copy print ?
  1. <!--在SDCard中创建与删除文件权限-->
  2. <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  3. <!--往SDCard中写入数据权限-->
  4. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2、 要判断一下是否插入SD卡和是否具有读写的能力:

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

如需转载引用请注明出处:http://blog.csdn.net/jiahui524

源代码下载:http://download.csdn.net/download/jiahui524/3799819

更多相关文章

  1. Android中的资源与国际化!
  2. 《第一行代码》学习笔记一
  3. android 权限详解
  4. android差分更新之服务端
  5. windows android apk,framework 解包,打包
  6. Android开发实践:Android交叉编译工具链的使用
  7. Android中可以做的两件坏事---破解锁屏密码和获取Wifi密码
  8. Android——文件路径(/mnt/sdcard/...)、Uri(content://media/ex
  9. NPM 和webpack 的基础使用

随机推荐

  1. Activity的启动模式以及Intent的七大属性
  2. appium新手入门(1)—— appium介绍
  3. 签名详解(一)
  4. Android(安卓)使用AgentWeb库轻量级H5混
  5. AsyncTask不同版本线程池的区别
  6. Android(安卓)Native性能测试方法
  7. INSTALL FAILED CONFLICTING PROVIDER
  8. Android(安卓)开发中屏蔽物理键盘
  9. Android(安卓)Studio 编译下载Gradle卡住
  10. flutter中实现仿Android端的onResume和on