Android数据存储之SD卡文件操作
赶上智能手机刚问世时有幸用过的小伙伴都知道,那时候的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,即可获取图片信息。
Android数据存储之SD卡文件操作的更多相关文章
- Android数据存储之SD卡
为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...
- sd卡文件操作
1. 得到存储设备的目录:/SDCARD(一般情况下) SDPATH=Environment.getExternalStorageDirectory()+"/"; 2. 判断SD卡 ...
- Android 最简单的SD卡文件遍历程序
package com.wenhao.test.sddemo; import java.io.File; import android.app.Activity; import android.os. ...
- Android数据存储-通过SharedPreferences实现记住密码的操作
在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...
- Android数据存储之内部存储、外部存储
首先来介绍下什么是内部存储? 在Android平台下,有着自己独立的数据存储规则,在windows平台下,应用程序能够自由的或者在特定的訪问权限基础上訪问或改动其它应用程序下的文件资源. 可是在And ...
- android 数据存储----文件方式 总结
在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中对资源文件的读取.数据区文件的读取.SD卡文件的读取及RandomAccessFile的方式和方法进行了整理. ...
- 【Android开发日记】之入门篇(七)——Android数据存储(上)
在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...
- Android - 数据存储 -存储文件
Android使用的文件系统和其他平台的基本磁盘的文件系统很相似.这里将要介绍如何使用File API在Android文件系统中读写文件. File对象适合按顺序读写大量的数据.例如,适合图片文件或者 ...
- Android数据存储:SDCard
Android数据存储之SDCard 0.获取sd卡路径. 1.讲述 Environment 类. 2.讲述 StatFs 类. 3.完整例子读取 SDCard 内存 0.获取sd卡路径 方法一: p ...
随机推荐
- Codeforces_723_C
http://codeforces.com/problemset/problem/723/C 将n个数替换为1-m内的数,使得1-m的个数的最小值最大,并且替换步骤最少.注意,不必将每个数都替换!! ...
- CCF_201312-4_有趣的数
dp题,dp[i][j]代表i位数,j状态的数量.其中,j 的状态表示值有6种. 0 1 2 √ j = 0 3 01 02 √ j = 1 03 12 13 23 √ j = 2 0 ...
- C 语言宏定义函数编写时 do-while 的妙用和一些注意事项
在 C 语言中,我们都知道可以用宏定义来编写函数,一般称为宏函数.如果一个宏函数比较复杂,那么在编写这样的宏函数是有一定技巧和注意事项的.文章给出一些我认为值得关注的地方,以及一些注意事项(个人建议) ...
- HDU6440 Dream(费马小定理+构造) -2018CCPC网络赛1003
题意: 给定素数p,定义p内封闭的加法和乘法,使得$(m+n)^p=m^p+n^p$ 思路: 由费马小定理,p是素数,$a^{p-1}\equiv 1(mod\;p)$ 所以$(m+n)^{p}\eq ...
- Ambari HDP 下 SPARK2 与 Phoenix 整合
1.环境说明 操作系统 CentOS Linux release 7.4.1708 (Core) Ambari 2.6.x HDP 2.6.3.0 Spark 2.x Phoenix 4.10.0-H ...
- EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构
前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下 ...
- SqlServer触发器的基础知识
触发器的基础知识:create trigger tr_name on table/view{for | after | instead of } [update][,][insert][,][dele ...
- FastDFS 配置文件 storage.conf
FastDFS 版本5.05 配置文件分为三部分 控制器:tracker.conf存储器:storage.conf 客户端:client.conf 文件位置:/etc/fdfsstorage.co ...
- 珠峰-webpack1
#### sourcemap #### watch 选项 #### 3个常用的小插件. #### 前端webpack的自己的mock #### 服务端引用了webpack的插件. #### resol ...
- Chrome Vue Devtools插件安装和使用
安装:fq后在chrome应用商店搜索 Vue Devtools并安装,安装成功后浏览器右上角有vue的图标 安装完毕后,打开含有vue框架的网站,这是vue图标会变亮,进入开发者工具,再右侧vue选 ...