赶上智能手机刚问世时有幸用过的小伙伴都知道,那时候的Android系统是把我们自己买的SD卡作为外部存储的,但是不知道从哪天开始,SD卡就被固化到智能手机的内部了,但是我们仍然把它称为外部存储。我想Android这样做的原因大概是因为市面上SD卡质量有好有坏,可能会影响APP运行吧(因为笔者就有过APP数据完全丢失的惨痛经历)。

获取手机上的SD卡信息通过Environment类实现,该类是App获取各种目录信息的工具,主要方法有以下7种:

  · getRootDirectory:获得系统根目录的路径。

  · getDataDirectory: 获得系统数据目录的路径。

  · getDownloadCacheDirectory: 获得下载缓存目录的路径。

  · getExternalStorageDirectory:获得SD卡的路径。

  · getExternalStorageState: 获得SD卡的状态。

  · getStorageState: 获得指定目录的状态

  · getExternalStoragePublicDirectory: 获得SD卡指定类型目录的路径

为正常操作SD卡,需要在AndroidManifest.xml文件中声明SD卡的权限,具体代码如下:

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

上述七种方式的使用效果如下:

在Android系统中,外部存储空间分为公有存储空间和私有存储空间两部分,顾名思义,公有存储空间是所有应用都可以访问的空间,而私有存储空间只能当前应用自己读写,其他应用没有访问权限。既然有两部分存储空间,那么这两个部分的路径获取方法也肯定是不一样的,前者通过前面提到的Environment.getExternalStoragePublicDirectory方法获得,后者通过getExternalFilesDir方法获得,代码就是简单的方法调用,这里不再给出。

说完了存储路径的获取,就正式到了文件读写的步骤了,这里只简单说一下文本文件读写和图片文件读写

文本文件读写一般借助于FileOutputStream和FileInputStream,文件输入输出流是java语言的基础工具,这里也不再详细介绍,只给出代码:

//把字符串保存到指定路径的文本文件
public static void saveText(String path,String txt){
try {
FileOutputStream fos=new FileOutputStream(path);//根据文件路径构建文件输出流对象
fos.write(txt.getBytes());//把字符串写入文件输出流
fos.close();
}catch (Exception e){
e.printStackTrace();
}
} //从指定路径的文本文件中读取内容字符串
public static String openText(String path){
String readStr="";
try{
FileInputStream fis=new FileInputStream(path);//根据文件路径构建文件输入流
byte[] b=new byte[fis.available()];
fis.read(b);//从文件输入流读取字节数组
readStr=new String(b);//把字节数组转化成字符串
fis.close();
}catch (Exception e){
e.printStackTrace();
}
return readStr;
}

Android的图片处理类是Bitmap,App读写Bitmap可以使用FileOutputStream 和FileInputStream。不过在实际开发中,读写图片文件一般用性能更好的BufferedOutputStream和BufferedInputStream。保存图片文件时用到Bitmap的compress方法,可指定图片类型和压缩质量;打开图片文件时使用BitmapFactory的decodeStream方法。读写图片的具体代码如下:

//把位图数据保存到指定路径的图片文件
public static void saveImage(String path,Bitmap bitmap){
try{
//根据指定文件路径构建缓存输出流对象
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(path));
//把位图数据压缩到缓存输出流中
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
//完成缓存输出流的写入动作
bos.flush();
//关闭缓存输出流
bos.close();
}catch (Exception e){
e.printStackTrace();
}
} //从指定路径的图片文件中读取位图数据
public static Bitmap openImage(String path){
Bitmap bitmap=null;
try {
//根据指定文件路径构架缓存输入流对象
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(path));
//从缓存输入流中解码位图数据
bitmap= BitmapFactory.decodeStream(bis);
bis.close();//关闭缓存输入流
}catch (Exception e){
e.printStackTrace();
}
//返回图片文件中的位图数据
return bitmap;
}

除了decodeStream之外,BitmapFactory还提供了其他方便简单的方法:

  · decodeFile: 该方法直接传文件路径的字符串,即可将指定路径的图片读取到bitmap对象

  · decodeResourse: 该方法主要是针对drawable的图片文件,第一个参数传getResourses(),第二个参数传drawable的图片资源id,即可获取图片信息。

最新文章

  1. iOS边练边学--父子控件之作为导航控制器的子类产生的问题以及网易新闻练习
  2. hdu 1850 Being a Good Boy in Spring Festival(Nimm Game)
  3. 3D objects key rendering steps
  4. Stars(BIT树状数组)
  5. CUSPARSE 第三章 CUSPARAE索引和数据格式
  6. 【Hibernate步步为营】--双向关联一对一映射具体解释(一)
  7. .NET:线程本地存储、调用上下文、逻辑调用上下文
  8. 兄弟连教育分享:用CSS实现鼠标悬停提示的方法
  9. 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)
  10. CAS实现单点登录SSO执行原理及部署
  11. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
  12. Confluence 6 自定义配色方案
  13. C# websocket与html js实现文件发送与接收处理
  14. gfs故障恢复
  15. BeautifulSoup 模块详解
  16. MAVEN 阿里云中央仓库
  17. Spring boot自动设置包依赖,根本不用记,
  18. JAVA—集合框架
  19. day48
  20. Datatable转实体 实体转换辅助类

热门文章

  1. AI产品经理工作流程——需求分析和产品设计
  2. 为什么尽量不要使用Executors创建线程池
  3. ajax 原生js封装ajax [转]
  4. Codeforces Round #617 (Div. 3) D. Fight with Monsters
  5. php 绘制验证码 示例
  6. 今天第一天开通博客,随笔总结一下resultType(属性)和resultMap,collection和association,Statement和PreparedStatement各自的区别
  7. 杭电------2097 Sky数(C语言写)
  8. PDO连接不上又不报错的问题
  9. Matplotlib数据可视化从入门到精通(持续更新)
  10. android button的selector