Android数据存储之内部存储、外部存储
首先来介绍下什么是内部存储?
在Android平台下,有着自己独立的数据存储规则,在windows平台下,应用程序能够自由的或者在特定的訪问权限基础上訪问或改动其它应用程序下的文件资源。
可是在Android平台下,一个应用程序全部的数据都是对外私有的,仅仅有应用程序自己本身才干够訪问。
当应用程序被安装到系统中后。其所在的包会有一个目录用于存放自己的数据,仅仅有这个应用程序才有对这个目录的写入权限,这个私有的数据文件位于Android/data/data目录下。
读取内部数据能够使用openFileOutput方法和openFileInput()方法。前者主要是向内部数据文件写入数据,后者主要是从内部数据文件中读取数据。
详细样例例如以下:
首先是写入数据:
try {
//从内部数据里获取目标文件
FileOutputStream fileoutput = openFileOutput("内部数据文件名称", Context.MODE_PRIVATE);
try {
//包装秤outputstreamwriter类,方便写入
OutputStreamWriter osw = new OutputStreamWriter(fileoutput, "制定字符集");
try {
//写入数据
osw.write(new String("asdfasfs"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
接下来是读取数据
try {
//从内部数据里获取目标文件
FileInputStream fileinput = openFileInput("filename");
//进行包装,方便读取
InputStreamReader isr;
try {
isr = new InputStreamReader(fileinput, "字符集");
//建立字符数组,用来保存读取的内容
try {
isr.read(new char[512]);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
以上是内部数据的读取。假设是图片等数据应当另行编码。
有了内部数据。对外部数据有该怎样读取呢?
首先读取外部数据须要在Manifest文件里建立权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
获取权限之后能够操作外部存储,就是我们的SD卡
获取SD卡须要用到环境类Environment。
//获取外部存储的文件位置
File sdcard = Environment.getExternalStorageDirectory();
须要说明的是最好在获取sd卡文件文件夹之前先检測sd卡的状态,依据API文档说明,SD卡的状态常量表示了SD卡的当前状态,如不可读取,不存在等。详细能够參见API文档。获取SD卡的状态例如以下:
Environment.getExternalStorageState()
它返回的是一个String对象,因此我们能够通过equal方法与SD卡状态常量进行比較后运行兴许操作。
SD卡的读取操作例如以下:
//读取数据的消息响应
btnRead.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File sdcardfile = new File(Environment.getExternalStorageDirectory(),"myNewFile.txt");
//先推断sd卡文件是否存在
if (sdcardfile.exists()) {
//检測能否够读取
if (sdcardfile.canRead()) {
try {
FileInputStream input = new FileInputStream(sdcardfile);
byte[] buffer = new byte[512];
try {
input.read(buffer);
tv_show.setText(new String(buffer,"GB2312"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else
{
Toast.makeText(getApplicationContext(), "未检測到sd卡", Toast.LENGTH_SHORT).show();
return;
}
}
} });
写入SD卡:
//写入数据的消息响应
btnWrite.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//获取外部存储的文件位置
File sdcard = Environment.getExternalStorageDirectory();
//新建文件
File newfile = new File(sdcard, "myNewFile.txt");
if (!sdcard.exists()) {
Toast.makeText(getApplicationContext(), "当前sd卡路径不存在", Toast.LENGTH_SHORT).show();
return;
}
else
{
try {
//在我的手机的存储目录中创建
if (newfile.exists()) {
Toast.makeText(getApplicationContext(), "文件已经存在", Toast.LENGTH_SHORT).show();
newfile.delete();
return;
}
newfile.createNewFile();
Toast.makeText(getApplicationContext(), "创建完毕", Toast.LENGTH_SHORT).show();
FileOutputStream outputstream = new FileOutputStream(newfile);
OutputStreamWriter writer = new OutputStreamWriter(outputstream, "GB2312");
writer.write(ed_text.getText().toString());
writer.flush();
writer.close();
outputstream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
最后简介下是怎样获取sd卡的当前存储状态的:
使用的类是StatFs类,能够从文件对象的getPath()获取:
//获取sd卡的存储状态
File sdcard = Environment.getExternalStorageDirectory();
StatFs sfs = new StatFs(sdcard.getPath());
//获取整体容量
long total = sfs.getTotalBytes();
//获取当前容量
long free = sfs.getFreeBytes();
TextView tv_sd = (TextView)findViewById(R.id.tv_sd_storage);
tv_sd.setText("SD还剩余:"+free/1024/1024+"MB /"+total/1024/1024+"MB");
ProgressBar progress = (ProgressBar) findViewById(R.id.progress);
float num = ((float)(free/1024/1024)/(float)(total/1024/1024))*100;
int progress1 = (int)num;
progress.setProgress(progress1);
Android数据存储之内部存储、外部存储的更多相关文章
- Android adb不是内部或外部命令 (转)
dos窗口运行adb命令出现错误:adb不是内部或外部命令…. 出现问题原因及解决办法: 1.没有配置相关环境变量. 只要将android 的sdk安装路径添加到系统变量Path中即可. (以win7 ...
- Android adb不是内部或外部命令 问题解决
就是没有配置环境变量, 这个只需要将android安装:例如C:\Program File\android-sdk-windows\tools加入到系统变量Path中,需要注意的是Path中会配置的有 ...
- Android数据保存之文件保存
前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以k ...
- 彻底了解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- 彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- 【转】彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- android 数据存储的几种方式
总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数 ...
- Android - 数据存储 -存储文件
Android使用的文件系统和其他平台的基本磁盘的文件系统很相似.这里将要介绍如何使用File API在Android文件系统中读写文件. File对象适合按顺序读写大量的数据.例如,适合图片文件或者 ...
- 详解Android数据存储技术
前言 学习Android相关知识,数据存储是其中的重点之一,如果不了解数据,那么让你跟一款没有数据的应用玩,你能玩多久呢?答案是这和没有手机几乎是差不多的.我们聊QQ,聊微信,看新闻,刷朋友圈等都是看 ...
随机推荐
- Adobe Audio 分轨录音教程(需要KX,Live机架)
一.需要的硬件和软件 1. 创新5.1声卡或7.1声卡: 2. 已安装KX驱动和Live机架,经过测试安装后需要重启电脑才能生效. 3. 已安装Adobe Audition 3.0 二.测试环境 WI ...
- 【5】namenode启动过程
1.格式化空间(第一次启动的操作): 命令:bin/hadoop -format //用于格式化HDFS,如果不是首次格式化,需要删除下面配置的tmp目录后再进行core-site.xml的配置: / ...
- 《项目架构那点儿事》——快速构建Junit用例
[前 言]按照惯例,在实际项目中我往往会对自己编写的程序进行测试,当测试通过后才能将其用于实战中,当然,编写单元测试是不可避免的,可以直接清晰的检验出 我们程序的可靠性.可只执行性,从中发现问题从而得 ...
- 休息,归类一下CSS初级的东西
css基础的东西集中体现在了"磊盒子"这一个枯燥无味的东西上面,灵活的运用盒子的内外边距,浮动,定位以及一些基础的属性,将一个静态的页面变得磊出来,这是CSS基础的练习. 在css ...
- [转载] MapReduce工作原理讲解
转载自http://www.aboutyun.com/thread-6723-1-1.html 有时候我们在用,但是却不知道为什么.就像苹果砸到我们头上,这或许已经是很自然的事情了,但是牛顿却发现了地 ...
- SICK激光雷达LMS511测量数据说明
帧结构说明 LMS511的官方手册存在几个版本,在<Laser Measurement Systems of the LMS500 Product Family>的英文手册中,对单次(连续 ...
- Swiper 判断上滑下拉操作
onTouchMove: function(swiper){ //手动滑动中触发//判断上滑下拉var i = mySwiper.translate;setTimeout(function() {va ...
- 基于FPGA的有限状态机浅析
前言:状态机大法好,状态机几乎可以实现一切时序逻辑电路. 有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机 ...
- LogCook 一个简单实用的Android日志管理工具
众所周知,日志的管理是软件系统很重要的一部分,千万不可忽略其重要性.完整的日志将会在系统维护中起着异常重要的作用,就好像磨刀不误砍柴工一样,日志就像对系统进行分析的工具,工具便捷了,对系统分析起来就能 ...
- ajax实现用户名校验的传统和jquery的$.post方式
第一种:传统的ajax异步请求,后台代码以及效果在最下边 首先我们在eclipse中创建一个注册页面regist.jsp,创建一个form表单,注意,由于我们只是实现用户名校验的效果,下边红色部门是我 ...