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

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

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

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

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

内部储存:

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

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

外部储存:

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

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

保存文件到内部储存

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

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

getFilesDir()

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

getCacheDir()

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

先看一下运行效果:

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

详细代码:

  1. package com.whathecode.storageoptinos;
  2.  
  3. import java.io.FileOutputStream;
  4.  
  5. import android.app.Activity;
  6. import android.content.Context;
  7. import android.content.SharedPreferences;
  8. import android.os.Bundle;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.EditText;
  12. import android.widget.Toast;
  13.  
  14. public class MainActivity extends Activity
  15. {
  16.  
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState)
  19. {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22.  
  23. final EditText namefield = (EditText) findViewById(R.id.username);
  24. final EditText agefield = (EditText) findViewById(R.id.age);
  25.  
  26. Button btnWrite = (Button) findViewById(R.id.write);
  27.  
  28. SharedPreferences spf = getSharedPreferences("record", MODE_PRIVATE);
  29. // 获取编辑器
  30. final SharedPreferences.Editor editor = spf.edit();
  31.  
  32. btnWrite.setOnClickListener(new View.OnClickListener()
  33. {
  34.  
  35. @Override
  36. public void onClick(View v)
  37. {
  38. String filename = "person.txt";
  39. // File file = new File(getBaseContext().getFilesDir(),
  40. // filename);
  41.  
  42. String username = namefield.getText().toString();
  43. String age = agefield.getText().toString();
  44.  
  45. try
  46. {
  47. FileOutputStream openFileOutput = openFileOutput(filename,
  48. Context.MODE_PRIVATE);
  49.  
  50. openFileOutput.write(username.getBytes());
  51. openFileOutput.write(age.getBytes());
  52.  
  53. openFileOutput.close();
  54.  
  55. Toast.makeText(getBaseContext(),
  56. "file saved at " + getFilesDir().toString(),
  57. Toast.LENGTH_LONG).show();
  58. } catch (Exception e)
  59. {
  60. e.printStackTrace();
  61. }
  62. }
  63. });
  64. }
  65. }

保存文件到外部储存

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

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

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

运行结果:

程序代码:

  1. package com.whathecode.storageoptinos;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5.  
  6. import android.app.Activity;
  7. import android.os.Bundle;
  8. import android.os.Environment;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.EditText;
  12. import android.widget.Toast;
  13.  
  14. public class MainActivity extends Activity
  15. {
  16.  
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState)
  19. {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22.  
  23. final EditText namefield = (EditText) findViewById(R.id.username);
  24. final EditText agefield = (EditText) findViewById(R.id.age);
  25.  
  26. Button btnWrite = (Button) findViewById(R.id.write);
  27.  
  28. btnWrite.setOnClickListener(new View.OnClickListener()
  29. {
  30.  
  31. @Override
  32. public void onClick(View v)
  33. {
  34. String filename = "person.txt";
  35.  
  36. String externDir = getExternalFilesDir(null).toString();
  37. // 准备数据写入
  38. String username = namefield.getText().toString();
  39. String age = agefield.getText().toString();
  40.  
  41. // 判断sd卡是否挂载,sd卡存在则开始写入文件
  42. if (Environment.getExternalStorageState().equals(
  43. Environment.MEDIA_MOUNTED))
  44. {
  45. try
  46. {
  47. FileOutputStream fos = new FileOutputStream(new File(
  48. externDir, filename));
  49. fos.write(username.getBytes());
  50. fos.write(age.getBytes());
  51.  
  52. fos.close();
  53.  
  54. Toast.makeText(getBaseContext(),
  55. "file saved at " + externDir, Toast.LENGTH_LONG)
  56. .show();
  57. } catch (Exception e)
  58. {
  59. e.printStackTrace();
  60. }
  61.  
  62. } else
  63. {
  64. Toast.makeText(getBaseContext(), "SD卡不存在",
  65. Toast.LENGTH_SHORT).show();
  66. }
  67.  
  68. }
  69. });
  70.  
  71. }
  72. }

文件保存路径:

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. node.js表单——formidable

    node处理表单请求,需要用到formidable包.安装formidable包的命令如下: npm install formidable 安装package的路径分为两种,一种是本地目录,一种是全局 ...

  2. linux 文件管理以及其相关指令

    Linux简介 严格的来讲,Linux 不算是一个操作系统,只是一个 Linux 系统中的内核, 即计算机软件与硬件通讯之间的平台:Linux的全称是GNU/Linux,这才算是一个真正意义上的Lin ...

  3. dba诊断之IO

    --查看占用系统io较大的session   SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,se.terminal,se.program ...

  4. System.getProperty()引起的悲剧--您的主机中的软件中止了一个已建立的连接

    我已无法形容此刻我的心情.. 本来是已经写好的netty5的demo程序,server和client之间创建tcp长连接的..然后随便传点数据的简单demo..然后今天试了一下tcp粘包的例子,用到了 ...

  5. MMORGP大型游戏设计与开发(客户端架构 part13 of vegine)

    一些数据是需要不断改动的,程序不可能因为这些改动而不厌其烦的去改动代码,早期的这种做法就成了程序员们最悲哀的痛苦.自从有了数据管理后,程序的世界逐渐清晰,这些烦恼也不再出现,不过若是要很好的管理数据可 ...

  6. NOIP2012借教室[线段树|离线 差分 二分答案]

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...

  7. voxel 与 pixel

    中文名称:体素,即顾名思义是体积的像素.用来在三维空间中表示一个显示基本点的单位.类似于二维平面下的pixel(像素). voxel是三维空间中定义一个点的图象信息的单位.在平面中定义一个点要两个坐标 ...

  8. FLEX的动画

    1.使用自带效果 在Flex里面不像在Flash里面随意制作动画了,Flex更趋向于应用程序,而不是动画制作了,所以没有了时间轴的概念.在Flex中使用动画效果,可以用Flex自带的Effect,或者 ...

  9. IE8 HACK介绍

    1.‘\9’: eg:.test { color/*\**/: blue\9 }.header {width:300px;} /* 所有浏览器*/.header {width/*\**/:330px\ ...

  10. HTML <map> 设置图热点

    需要在一张图片中,设置一个区域为热点就用到了<map> 定义一个客户端图像映射.图像映射(image-map)指带有可点击区域的一幅图像. <img src="planet ...