首先来介绍下什么是内部存储?

在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数据存储之内部存储、外部存储的更多相关文章

  1. Android adb不是内部或外部命令 (转)

    dos窗口运行adb命令出现错误:adb不是内部或外部命令…. 出现问题原因及解决办法: 1.没有配置相关环境变量. 只要将android 的sdk安装路径添加到系统变量Path中即可. (以win7 ...

  2. Android adb不是内部或外部命令 问题解决

    就是没有配置环境变量, 这个只需要将android安装:例如C:\Program File\android-sdk-windows\tools加入到系统变量Path中,需要注意的是Path中会配置的有 ...

  3. Android数据保存之文件保存

    前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以k ...

  4. 彻底了解android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  5. 彻底理解android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  6. 【转】彻底理解android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  7. android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  8. android 数据存储的几种方式

    总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数 ...

  9. Android - 数据存储 -存储文件

    Android使用的文件系统和其他平台的基本磁盘的文件系统很相似.这里将要介绍如何使用File API在Android文件系统中读写文件. File对象适合按顺序读写大量的数据.例如,适合图片文件或者 ...

  10. 详解Android数据存储技术

    前言 学习Android相关知识,数据存储是其中的重点之一,如果不了解数据,那么让你跟一款没有数据的应用玩,你能玩多久呢?答案是这和没有手机几乎是差不多的.我们聊QQ,聊微信,看新闻,刷朋友圈等都是看 ...

随机推荐

  1. VS2015编译VS2013工程文件出错

    错误:未能从程序集"C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Build.Tasks.v14.0.dll"加载任务工厂&q ...

  2. MQTT——订阅报文

    我们已经把相关的连接报文搞定了.笔者想来想去还是决定先讲解一下订阅报文(SUBSCRIBE ).如果传统的通信方式是客户端和服务端之间一般就直接传输信息.但是MQTT的通信方式是通过发布/订阅的方式进 ...

  3. JAVAscript学习笔记 js条件语句 第三节 (原创) 参考js使用表 (2017-09-14 15:55)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. MSBuild Tools解决办法

    每次在CI上通过Msbuild做发布,基本都会碰到下面的问题 error MSB4019: 未找到导入的项目"C:\Program Files (x86)\MSBuild\Microsoft ...

  5. hibernate flushMode 错误

    1 十一月 15, 2017 10:13:36 上午 org.apache.struts2.dispatcher.Dispatcher error 2 严重: Exception occurred d ...

  6. 掌握numpy(三)

    统计功能 前面都是介绍numpy的一些特性,被称为数学运算神器怎么能少了统计功能呢 ndarray的方法 a = np.array([[-2.5, 3.1, 7], [10, 11, 12]]) &g ...

  7. pt-show-grants

    用法: pt-show-grants [OPTION ... ] [DSN]   例子: pt-show-grants pt-show-grants --separate --revoke | dif ...

  8. vim7.3中文乱码问题

    在测试机安装vim7.3之后编辑中文文本出现乱码问题. vim在编译安装的时候: ./configure --enable-gdb --enable-multibyte --enable-cscope ...

  9. IIS解决CPU和内存占用率过高的问题

    发现进程中的w3wp占用率过高. 经过查询,发现如下: w3wp.exe是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运 ...

  10. Java中abstract关键字详解

    abstract只能修饰类(class) 和 方法.而不能修饰成员变量.这是由于抽象的概念确定的.只有类和方法可以抽象出来,而成员变量不需要抽象. abstract修饰类 abstract之所以出现, ...