上一节我们学习了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. }


实现效果

Android之Android的数据存储--SD卡_第1张图片

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

Android之Android的数据存储--SD卡_第2张图片

开发注意事项:

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. Android——文件路径(/mnt/sdcard/...)、Uri(content://media/ex
  3. 64位 ubuntu android SDK 无法新建AVD,adb 没有那个文件或目录的
  4. Android开发---xml布局文件中的常见属性总结
  5. webservice二进制文件传输
  6. 浅谈Android文件管理器的几种实现方式(原理篇)--对我有帮助
  7. android通过反射获取内置外置存储器列表
  8. Android文件系统深入剖析
  9. Android 操作系统 获取Root权限 原理解析

随机推荐

  1. 选项卡使用方法二(Android学习随笔十三)
  2. ndk下使用sqlite
  3. android MTP 过滤指定的文件格式
  4. Android中TextView中内容不换行的解决方
  5. Android(安卓)Handler 消息机制原理解析
  6. 简单实现Android顶部工具栏和底部工具栏(
  7. 【Android热修复与插件化 三】ClassLoade
  8. 介绍一个Android开源项目:GifView——Andr
  9. android 5.0多用户支持
  10. Android中做一个无标题窗口