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,聊微信,看新闻,刷朋友圈等都是看 ...
随机推荐
- Selenium WebDriver 中鼠标和键盘事件分析及扩展[转载]
原文:http://www.ibm.com/developerworks/cn/java/j-lo-keyboard/ 概念 在使用 Selenium WebDriver 做自动化测试的时候,会经常模 ...
- 第一数学归纳法 vs 第二数学归纳法 vs 良序定理
相关: 第一数学归纳法 vs 第二数学归纳法 vs 良序定 第二数学归纳法:硬币问题和堆垛游戏 第一数学归纳法:施塔特中心的地板砖 良序原理:算术基本定理的证明 From : Mathematics ...
- How to Quickly Create a Copy of a Table using Transact-SQL
The easiest way to create a copy of a table is to use a Transact-SQL command. Use SELECT INTO to ext ...
- 按键(vb)启动指定目录的程序以及获取当前应用路径
Private Declare Function GetDesktopWindow Lib "user32" () As Long Private Declare Function ...
- gulp一般使用
gulp的基本使用总结了一下几点: 1.gulp-ejs的使用 [ file include,html文件合并 ]: let ejs = require("gulp-ejs"); ...
- [转载] 谷歌技术"三宝"之MapReduce
转载自http://blog.csdn.net/opennaive/article/details/7514146 江湖传说永流传:谷歌技术有"三宝",GFS.MapReduce和 ...
- From missionary to firebrand--Eisle Tu [20160102]
From missionary to firebrand 杜叶锡恩(1913年(癸丑年)-2015年(乙未年),英文名字Elsie Hume Elliot Tu,丈夫是教育家杜学魁.她是香港著名的 ...
- Vue学习笔记-Vue基础入门
此篇文章是本人在学习Vue是做的部分笔记的一个整理,内容不是很全面,希望能对阅读文章的同学有点帮助. 什么是Vue? Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式 ...
- selenium3.7+ python3 添加cookie模拟登陆
一.背景介绍 最近做一个爬虫项目,用selenium调用浏览器去获取渲染后的源码,但是每次登陆都需要手机验证,这真的是头痛啊,这种验证方式不要想着去破解,还是老老实实用手机收验证码去吧!反正我是不知道 ...
- Python 函数相关概念
高阶函数 数学概念 y=g(f(x)) 在数学和计算机科学中,高阶函数应当至少满足下面一个条件的函数 条件1. 接受一个或多个函数作为参数 条件2. 输出一个函数 举例: def count ...