(内容整理自张泽华教程)

1. 概述

使用文件进行数据存储

首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。

public class FileActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

...

FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE);

outStream.write("传智播客".getBytes());

outStream.close();

}

}

openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/”
,如果文件不存在,Android
会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如:
/data/data/cn.itcast.action/files/itcast.txt,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File
Explorer视图,然后在File Explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。

openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE    = 
0

Context.MODE_APPEND    = 
32768

Context.MODE_WORLD_READABLE =  1

Context.MODE_WORLD_WRITEABLE =  2

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

如果希望文件被其他应用读和写,可以传入:

openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

读取文件内容

如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用Activity提供openFileInput()方法。

FileInputStream inStream = this.getContext().openFileInput("itcast.txt");

Log.i("FileTest", readInStream(inStream));

readInStream()的方法请看本页下面备注。

或者直接使用文件的绝对路径:

File file = new File("/data/data/cn.itcast.action/files/itcast.txt");

FileInputStream inStream = new FileInputStream(file);

Log.i("FileTest", readInStream(inStream));

注意:上面文件路径中的“cn.itcast.action”为应用所在包,当你在编写代码时应替换为你自己应用使用的包。

对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

Activity还提供了getCacheDir()和getFilesDir()方法:

getCacheDir()方法用于获取/data/data/<package name>/cache目录

getFilesDir()方法用于获取/data/data/<package name>/files目录

把文件存放在SDCard

在程序中访问SDCard,你需要申请访问SDCard的权限

在AndroidManifest.xml中加入访问SDCard的权限如下:

<!-- 在SDCard中创建与删除文件权限
-->

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

<!-- 往SDCard写入数据权限
-->

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

要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。

注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录

File saveFile = new File(sdCardDir, “itcast.txt”);

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("传智播客".getBytes());

outStream.close();

}

Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。

Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:

File sdCardDir = new File("/mnt/sdcard"); //获取SDCard目录

File saveFile = new File(sdCardDir, "itcast.txt");

//上面两句代码可以合成一句:
File saveFile = new File("/mnt/sdcard/itcast.txt");

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("传智播客test".getBytes());

outStream.close();

2. 示例代码

获取SD卡大小示例代码

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. TextView tv = (TextView) findViewById(R.id.tv_sdsize);
  5. File path = Environment.getExternalStorageDirectory();
  6. StatFs stat = new StatFs(path.getPath());
  7. long blockSize = stat.getBlockSize();
  8. long availableBlocks = stat.getAvailableBlocks();
  9. long sizeAvailSize = blockSize * availableBlocks;
  10. String str = Formatter.formatFileSize(this, sizeAvailSize);
  11. tv.setText(str);
  12. }

数据存储示例代码:

activity_main.xml 布局

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context=".MainActivity" >
  7.  
  8. <TextView
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="@string/input_name" />
  12.  
  13. <EditText
  14. android:id="@+id/et_name"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:inputType="text" />
  18.  
  19. <TextView
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:text="@string/input_password" />
  23.  
  24. <EditText
  25. android:id="@+id/et_password"
  26. android:layout_width="fill_parent"
  27. android:layout_height="wrap_content"
  28. android:inputType="textPassword" />
  29.  
  30. <RelativeLayout
  31. android:layout_width="fill_parent"
  32. android:layout_height="wrap_content" >
  33.  
  34. <CheckBox
  35. android:id="@+id/cb_remember"
  36. android:layout_width="wrap_content"
  37. android:layout_height="wrap_content"
  38. android:text="@string/remember_pwd" />
  39.  
  40. <Button
  41. android:onClick="login"
  42. android:layout_alignParentRight="true"
  43. android:layout_width="wrap_content"
  44. android:layout_height="wrap_content"
  45. android:text="@string/login" />
  46. </RelativeLayout>
  47.  
  48. <RadioGroup
  49. android:id="@+id/rg_save_location"
  50. android:orientation="horizontal"
  51. android:layout_width="wrap_content"
  52. android:layout_height="wrap_content" >
  53.  
  54. <RadioButton
  55. android:id="@+id/rb_rom"
  56. android:layout_width="wrap_content"
  57. android:layout_height="wrap_content"
  58. android:checked="true"
  59. android:text="ROM" />
  60.  
  61. <RadioButton
  62. android:id="@+id/rb_sd"
  63. android:layout_width="wrap_content"
  64. android:layout_height="wrap_content"
  65. android:text="SD" />
  66.  
  67. <RadioButton
  68. android:id="@+id/rb_sp"
  69. android:layout_width="wrap_content"
  70. android:layout_height="wrap_content"
  71. android:text="SP" />
  72. </RadioGroup>
  73.  
  74. </LinearLayout>

AndroidManifest.xml SD权限

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.itheima.login"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="17" />
  10. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  11.  
  12. <application
  13. android:allowBackup="true"
  14. android:icon="@drawable/ic_launcher"
  15. android:label="@string/app_name"
  16. android:theme="@style/AppTheme" >
  17. <activity
  18. android:name="com.itheima.login.MainActivity"
  19. android:label="@string/app_name" >
  20. <intent-filter>
  21. <action android:name="android.intent.action.MAIN" />
  22.  
  23. <category android:name="android.intent.category.LAUNCHER" />
  24. </intent-filter>
  25. </activity>
  26. </application>
  27.  
  28. </manifest>

SaveService.java 业务类

  1. package com.itheima.login.service;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8.  
  9. import android.content.Context;
  10. import android.content.SharedPreferences;
  11. import android.content.SharedPreferences.Editor;
  12. import android.os.Environment;
  13.  
  14. import com.itheima.login.utils.StreamTools;
  15.  
  16. public class SaveService {
  17. /**
  18. * 保存数据到手机rom的文件里面.
  19. * @param context 应用程序的上下文 提供环境
  20. * @param name 用户名
  21. * @param password 密码
  22. * @throws Exception
  23. */
  24. public static void saveToRom(Context context, String name , String password) throws Exception{
  25. //File file = new File("/data/data/com.itheima.login/files/pwd.txt");
  26. File file = new File(context.getFilesDir(),"pwd.txt");
  27. FileOutputStream fos = new FileOutputStream(file);
  28. String txt = name+":"+password;
  29. fos.write(txt.getBytes());
  30. fos.flush();
  31. fos.close();
  32. }
  33. /**
  34. * 从rom读取用户的密码信息
  35. * @param context
  36. * @return
  37. */
  38. public static String readFromRom(Context context) throws Exception{
  39. File file = new File(context.getFilesDir(),"pwd.txt");
  40. FileInputStream fis = new FileInputStream(file);
  41. String result = StreamTools.readFromStream(fis);
  42. return result;
  43. }
  44.  
  45. /**
  46. * 保存数据到SD卡
  47. * @param name 用户名
  48. * @param password 密码
  49. * @throws Exception
  50. */
  51. public static void saveTOSD(String name ,String password) throws Exception{
  52. File file = new File(Environment.getExternalStorageDirectory(),"pwd.txt");
  53. FileOutputStream fos = new FileOutputStream(file);
  54. String txt = name+":"+password;
  55. fos.write(txt.getBytes());
  56. fos.flush();
  57. fos.close();
  58. }
  59.  
  60. /**
  61. * 保存应用程序数据 到sharedpreference
  62. * @param context 上下文
  63. * @param name 姓名
  64. * @param password 密码
  65. */
  66. public static void saveTOSP (Context context, String name, String password){
  67. //获取系统的一个sharedpreference文件 名字叫 sp
  68. SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);
  69. //创建一个编辑器 可以编辑 sp
  70. Editor editor = sp.edit();
  71. editor.putString("name", name);
  72. editor.putString("password", password);
  73. editor.putBoolean("boolean", false);
  74. editor.putInt("int", 8888);
  75. editor.putFloat("float",3.14159f);
  76. //注意:调用 commit 提交 数据到文件.
  77. editor.commit();
  78. //editor.clear();
  79. }
  80.  
  81. /**
  82. * 获取系统sharepreference里面的数据
  83. * @param context
  84. * @return
  85. */
  86. public static Map<String,String> readFromSP(Context context){
  87. Map<String,String> map = new HashMap<String, String>();
  88. SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_PRIVATE);
  89. String name = sp.getString("name", "defaultname");
  90. String password = sp.getString("password", "password");
  91. map.put("name", name);
  92. map.put("password", password);
  93. return map;
  94. }
  95.  
  96. }

MainActivity.java

  1. package com.itheima.login;
  2.  
  3. import java.util.Map;
  4.  
  5. import com.itheima.login.service.SaveService;
  6.  
  7. import android.os.Bundle;
  8. import android.os.Environment;
  9. import android.app.Activity;
  10. import android.text.TextUtils;
  11. import android.util.Log;
  12. import android.view.View;
  13. import android.widget.CheckBox;
  14. import android.widget.EditText;
  15. import android.widget.RadioGroup;
  16. import android.widget.Toast;
  17.  
  18. public class MainActivity extends Activity {
  19. private static final String TAG = "MainActivity";
  20. private EditText et_name;
  21. private EditText et_password;
  22. private CheckBox cb_remember;
  23. private RadioGroup rg_save_location;
  24.  
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29. et_name = (EditText) findViewById(R.id.et_name);
  30. et_password = (EditText) findViewById(R.id.et_password);
  31. cb_remember = (CheckBox) findViewById(R.id.cb_remember);
  32. rg_save_location = (RadioGroup) findViewById(R.id.rg_save_location);
  33.  
  34. // 检查 rom文件里面是否 有 密码信息
  35. /*try {
  36. String result = SaveService.readFromRom(this);
  37. String[] infos = result.split(":");
  38. et_name.setText(infos[0]);
  39. et_password.setText(infos[1]);
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }*/
  43.  
  44. //获取sp里面的数据
  45.  
  46. Map<String, String> map = SaveService.readFromSP(this);
  47. et_name.setText(map.get("name"));
  48. et_password.setText(map.get("password"));
  49.  
  50. }
  51.  
  52. public void login(View view) {
  53. String name = et_name.getText().toString().trim();
  54. String password = et_password.getText().toString().trim();
  55. if (TextUtils.isEmpty(name) || TextUtils.isEmpty(password)) {
  56. Toast.makeText(this, R.string.error_msg, Toast.LENGTH_SHORT).show();
  57. return;
  58. }
  59. if (cb_remember.isChecked()) {
  60. Log.i(TAG, "记住密码");
  61. Log.d(TAG, "NAME=" + name);
  62. Log.d(TAG, "PASSWORD=" + password);
  63. int radiobuttonId = rg_save_location.getCheckedRadioButtonId();
  64. switch (radiobuttonId) {
  65. case R.id.rb_rom:
  66. try {
  67. SaveService.saveToRom(this, name, password);
  68. Toast.makeText(this, "保存rom用户名密码 成功", Toast.LENGTH_LONG)
  69. .show();
  70. } catch (Exception e) {
  71. e.printStackTrace();
  72. Toast.makeText(this, "保存rom用户名密码 失败", Toast.LENGTH_LONG)
  73. .show();
  74. }
  75. break;
  76.  
  77. case R.id.rb_sd:
  78. if (Environment.MEDIA_MOUNTED.equals(Environment
  79. .getExternalStorageState())) {
  80. try {
  81. SaveService.saveTOSD(name, password);
  82. Toast.makeText(this, "保存sd用户名密码 成功", Toast.LENGTH_LONG)
  83. .show();
  84. } catch (Exception e) {
  85. e.printStackTrace();
  86. Toast.makeText(this, "保存sd用户名密码 失败", Toast.LENGTH_LONG)
  87. .show();
  88. }
  89. }else{
  90. Toast.makeText(this, "sd卡不可用 ,请检查sd卡状态", 0).show();
  91. }
  92. break;
  93.  
  94. case R.id.rb_sp:
  95. SaveService.saveTOSP(this, name, password);
  96. Toast.makeText(this, "保存到sp完成", 0).show();
  97. break;
  98. }
  99.  
  100. } else {
  101. Log.i(TAG, "不需要记住密码");
  102. }
  103.  
  104. }
  105.  
  106. }

Android -- 读写文件到内部ROM,SD卡,SharedPreferences,文件读写权限的更多相关文章

  1. 单元测试+内存、SD卡、SP读写+XmlPullParser

    测试: 测试的相关概念 1.根据是否知道源代码分类: 黑盒测试: a - b - c 边值测试 测试逻辑业务 白盒测试: 根据源代码写测试方法 或者 测试用例; 2.根据测试的粒度分类: 方法测试:写 ...

  2. Android 读写SD卡的文件

    今天介绍一下Android 读写SD卡的文件,要读写SD卡上的文件,首先需要判断是否存在SD卡,方法: Environment.getExternalStorageState().equals(Env ...

  3. 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题

    快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题 转 https://www.jb51.net/article/144939.htm 今天小编就为大家分享一篇快速解决设置And ...

  4. 转-Android 之 使用File类在SD卡中读取数据文件

    如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码:   <!-- 在sd中创建和删除文件的权限 --> ...

  5. Android SD卡创建文件和文件夹失败

    原文:Android SD卡创建文件和文件夹失败 功能需要,尝试在本地sd卡上创建文件和文件夹的时候,报错,程序崩溃. 一般情况下,是忘记给予sd卡的读写权限.但是这里面权限已经给了,还是报错. 在网 ...

  6. Android开发之下载Tomcat服务器的文件到模拟器的SD卡

    Tomcat服务器可以到Apache的官网去下载http://tomcat.apache.org/,如何配置和使用百度下也有很多介绍,只要把Java的SDK配下java_home环境变量就行了,因为T ...

  7. Android从raw、assets、SD卡中获取资源文件内容

    先顺带提一下,raw文件夹中的文件会和project一起经过编译,而assets里面的文件不会~~~   另外,SD卡获取文件需要权限哦! //从res文件夹中的raw 文件夹中获取文件并读取数据 p ...

  8. Android—将Bitmap图片保存到SD卡目录下或者指定目录

    直接上代码就不废话啦 一:保存到SD卡下 File file = new File(Environment.getExternalStorageDirectory(), System.currentT ...

  9. Android--手持PDA读取SD卡中文件

    近两年市场上很多Wince设备都开始转向Android操作系统,最近被迫使用Android开发PDA手持设备.主要功能是扫描登录,拣货,包装,发货几个功能.其中涉及到商品档的时候大概有700左右商品要 ...

  10. 模拟器下的虚拟sd卡添加文件

    1.若出现mkdir failed for myData Read-only file system,在执行 adb shell 命令后,执行mount -o remount ,rw / (去除文件的 ...

随机推荐

  1. 隐藏内容但仍保持占位的css写法

    通常显示和隐藏内容都会用display:block;和display:none; 如果想要保持内容的占位可以用visbility:visible; 和visiblity:hidden;来控制内容的显示 ...

  2. Python IDLE或shell中切换路径

    在Python自带的编辑器IDLE中或者python shell中不能使用cd命令,那么跳到目标路径呢.方法是使用os包下的相关函数实现路径切换功能. import os  os.getcwd() # ...

  3. cygwin简介,安装及卸载(体验UNIX & Linux环境)

    对于爱好者或初学者来说,为了体验UNIX & Linux环境,去安装虚拟机或双系统稍显麻烦,cygwin是一个很好的选择 具/原料   安装windows的电脑一台(可以联网) 法/步骤   ...

  4. js身份证号有效性验证

    1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用户名和身份证号就可以实名 ...

  5. C++ 常见字符处理 收录

    1.string字符串删除 字符串中 指定字符 std::string& HTTPRequestHandlerImpl::replace_all_distinct(std::string&am ...

  6. 细数Python中的数据类型以及他们的方法

    一.数据类型的种类及主要功能 1.数字类型 数字类型主要是用来计算,它分为整数类型int和浮点类型float 2.布尔类型 布尔类型主要是用于判断,它分为真True和False两种 3.字符串类型 字 ...

  7. 流畅的python 14章可迭代的对象、迭代器 和生成器

    可迭代的对象.迭代器和生成器 迭代是数据处理的基石.扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项.这就是迭代器模式(Iterator pattern). 迭 ...

  8. Python面向对象高级编程-_slots_

    使用_slots_ 正常情况下,当定义一个class,创建一个class的实例后,可以给实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Stu ...

  9. always on 之路实践(未完)

    概念及参考:http://www.mssqlmct.cn/dba/?post=97 准备:利用vmvare workstation12 克隆了4台windows server 2008 datacen ...

  10. JQuery操作select中的option

    html页面代码例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...