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,聊微信,看新闻,刷朋友圈等都是看 ...
随机推荐
- eclipse中删除多余的tomcat server
在eclipse菜单中选择Window--Show View--Server--Servers,打开这个服务窗口,将多余的服务删除即可. 如果每次启动中太卡没反应,那就是服务没选择好,或是端口冲突的原 ...
- PHP和java比较
这样从几个方面来看:一.运行机制:Java代码被编译成字节码后,会在虚拟机里由JIT进行二次编译成为本地码,据传言其执行速度可以和C++相媲美,经过我自己测试,用Java实现一个简单的Memcache ...
- [转载] NodeJS无所不能:细数十个令人惊讶的NodeJS开源项目
转载自http://www.searchsoa.com.cn/showcontent_79099.htm 在几年的时间里,Node.JS逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量 ...
- Python之配置模块ConfigParser
http://docs.python.org/2/library/configparser.html http://www.cnblogs.com/sislcb/archive/2008/11/25/ ...
- Java Web基础入门
前言 语言都是相通的,只要搞清楚概念后就可以编写代码了.而概念是需要学习成本的. Java基础 不用看<编程思想>,基础语法看 http://www.runoob.com/java/jav ...
- PHP设计模式之工厂模式
工厂模式(Factory pattern)和单例模式一样,是另外一种创建型模式. 和单例模式不同的是,单例模式会创建和管理一个单独的类型的单一对象,工厂模式则是用于创建多种不同类型的类的多个对象. 工 ...
- java oop详解
近日来重温了一下java oop的知识.加深了对面向对象的理解.尤其时继承方面.故写一篇博客.记录一下自己的想法和心得 1.面向对象主要分为三大点(封装,继承,多态) 封装的思想促进了类的形成.相比于 ...
- ECMAScript6词法
ES6简介 ECMAScript 6.0(简称 ES6)是 JavaScript 语言的下一代标准,它于2015 年 6 月正式发布.ECMAScript 和 JavaScript 的关系是,前者是后 ...
- 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师
为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...
- SSM框架下结合 log4j、slf4j打印日志
首先加入log4j和slf4j的jar包 <!-- 日志处理 <!-- slf4j日志包--> <dependency> <groupId>org.slf4j ...