在上一篇文章中我们介绍了SharedPreferences的使用方法。

今天我们继续介绍另一种储存数据的方式:使用内部储存和外部储存

每一个Android设备都拥有两个数据储存区域:外部储存和外部储存

那么我们应该采用哪种储存方式呢?

我们先对比一下这两种储存方式的不同:

内部储存:

  • 总是可用的
  • 保存在这里的文件只能被你的app访问
  • 当程序被卸载的时候,系统会删除所有属于该应用的文件

    当你不希望你的文件被其他人或应用访问到的时候,内部储存是最好的选择

外部储存:

  • 当sd卡被用户卸载的时候不可用,因此可能需要做额外的检测动作
  • 外部储存可被所有人或应用读取,安全性差
  • 当应用被卸载的时候,只有保存在通过getExternalFilesDir()获取的路径上的文件被删除

    当储存空间紧缺和文件的访问不需要被限制的时候,外部储存是最好的选择

保存文件到内部储存

文件的操作主要用到java的io包里面的类。

要获取属于你的程序的储存空间,可以使用下面的两个方法:

getFilesDir()

返回一个File类型的内部储存路径

getCacheDir()

返回一个File类型的内部临时储存路径

先看一下运行效果:

运行完毕到Eclipse的ddms视图就可以看到文件已经被写入:

详细代码:

package com.whathecode.storageoptinos;

import java.io.FileOutputStream;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity
{ @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final EditText namefield = (EditText) findViewById(R.id.username);
final EditText agefield = (EditText) findViewById(R.id.age); Button btnWrite = (Button) findViewById(R.id.write); SharedPreferences spf = getSharedPreferences("record", MODE_PRIVATE);
// 获取编辑器
final SharedPreferences.Editor editor = spf.edit(); btnWrite.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{
String filename = "person.txt";
// File file = new File(getBaseContext().getFilesDir(),
// filename); String username = namefield.getText().toString();
String age = agefield.getText().toString(); try
{
FileOutputStream openFileOutput = openFileOutput(filename,
Context.MODE_PRIVATE); openFileOutput.write(username.getBytes());
openFileOutput.write(age.getBytes()); openFileOutput.close(); Toast.makeText(getBaseContext(),
"file saved at " + getFilesDir().toString(),
Toast.LENGTH_LONG).show();
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}
}

保存文件到外部储存

和内部储存不同,写文件到外部储存需要在AndroidManifest文件中获取相应的权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

当你的程序获得了写外部储存的权限的时候,同时隐式地获得读的权限,因此不需要另外添加读的权限。

运行结果:

程序代码:

package com.whathecode.storageoptinos;

import java.io.File;
import java.io.FileOutputStream; import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity
{ @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final EditText namefield = (EditText) findViewById(R.id.username);
final EditText agefield = (EditText) findViewById(R.id.age); Button btnWrite = (Button) findViewById(R.id.write); btnWrite.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{
String filename = "person.txt"; String externDir = getExternalFilesDir(null).toString();
// 准备数据写入
String username = namefield.getText().toString();
String age = agefield.getText().toString(); // 判断sd卡是否挂载,sd卡存在则开始写入文件
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
try
{
FileOutputStream fos = new FileOutputStream(new File(
externDir, filename));
fos.write(username.getBytes());
fos.write(age.getBytes()); fos.close(); Toast.makeText(getBaseContext(),
"file saved at " + externDir, Toast.LENGTH_LONG)
.show();
} catch (Exception e)
{
e.printStackTrace();
} } else
{
Toast.makeText(getBaseContext(), "SD卡不存在",
Toast.LENGTH_SHORT).show();
} }
}); }
}

文件保存路径:

Android下的数据储存方式( 二)的更多相关文章

  1. Android下的数据储存方式(三)

      Android下最好的数据储存方式:关系型数据库sqlite.   数据库的创建:使用SqliteOpenHelper类 结合SqliteOpenHelper类和SQLiteDatabase类的帮 ...

  2. Android下的数据储存方式

      安卓系统默认提供了一下几种数据储存的方式: Shared Preferences 内部储存 外部储存 SQLite数据库 保存到网络服务器   使用Shared Preferences       ...

  3. Android MVP模式简单易懂的介绍方式 (二)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...

  4. 关系型数据库与HBase的数据储存方式差别

    现在Bigtable型(列族)数据库应用越来越广,功能也非常强大. 可是非常多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表.存储.查询. 本文以hbase举例讲述数据模式的变化. 传 ...

  5. Android下的数据存储与訪问 --- 以文件的形式

    Android下的数据存储与訪问 --- 以文件的形式 1.1 储存文件存放在手机内存中: // *** 储存数据到 /data/data/包名/files/jxn.txt文件里 String dat ...

  6. Android中的数据储存

    数据的储存是一个十分重要的功能,它涉及到各种类型的数据,各种的储存方式,今天就接触了Android中数据储存的简单应用,有一种方式是可以将存入的数据原封不动的存储起来,这里要用到openfileout ...

  7. Android笔记:数据储存

    1.文件存储 文件存储是Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据. ...

  8. [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据

    SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. 主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceS ...

  9. Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用

    前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...

随机推荐

  1. linux进程间通信-管道

    一 管道的局限性 管道有两个局限性:(1)他是半双工(即数据只能在一个方向上流动).(2)它只能在具有公共祖先的进程之间使用.一个管道由一个进程创建,然后该 进程调用fork,此后父子进程之间就可该管 ...

  2. 单机搭建Android开发环境(四)

    单机搭建安卓开发环境,前三篇主要是磨刀霍霍,这一篇将重点介绍JDK.REPO.GIT及编译工具的安装,下载项目代码并编译.特别说明,以下操作基于64位12.04 Server版Ubuntu.若采用其他 ...

  3. 洛谷U4727小L的二叉树[树转序列 LIS]

    题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...

  4. JVM再了解了解

    转自 http://www.cnblogs.com/Coda/p/4331432.html 相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任 ...

  5. Zygote进程【2】——Zygote的分裂

    在Zygote的诞生一文中init进程是如何一步步创建Zygote进程的,也了解了Zygote的进程的作用.Zygote进程的诞生对于整个Java世界可以说有着"开天辟地"的作用, ...

  6. iOS RunTime运行时(1):类与对象

    Objective-C语言是一门动态语言,他将很多静态语言在编译和链接期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码更具有灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一下 ...

  7. HTML 学习笔记 CSS(选择器3)

    CSS 属性选择器 属性选择器可以根据元素的额属性以及属性值来选择元素 例子1 如果 你希望把包含title的所有元素变成红色 *[title] {color:red} 例子2 与上面类似 可以只对有 ...

  8. EntityFramework Core 封装

    public class EntityBaseRepository<T> : IEntityBaseRepository<T> where T : class, IEntity ...

  9. 使用华为U8860测试时出现“Unable to open log device '/dev/log/main': No such file or directory”

    这是因为华为默认禁掉了log输出, 解决办法: 拨号: *#*#2846579#*#* 会显示工程菜单, Go to "ProjectMenu" -> "Backg ...

  10. notes:spm多重比较校正

    SPM做完统计后,statistical table中的FDRc实际上是在该p-uncorrected下,可以令FDR-correcred p<=0.05的最小cluster中的voxel数目: ...