1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径:

File file = new File(Environment.getExternalStorageDirectory(),"info.txt");
FileOutputStream fos = new FileOutputStream(file);//打开输出流,相应的路径下创建文件info.txt

fos.write("This is a good Boy".getBytes());  //public void write(byte[] buffer) throws IOException {……};

                                                                      //public byte[] getBytes() {……}
fos.close();

2. Environment 是一个提供访问环境变量的类。Environment 包含常量:
String MEDIA_BAD_REMOVAL
解释:返回getExternalStorageState() ,表明SDCard 被卸载前己被移除
String MEDIA_CHECKING
解释:返回getExternalStorageState() ,表明对象正在磁盘检查。
String MEDIA_MOUNTED
解释:返回getExternalStorageState() ,表明存储媒体已经挂载,对象是否存在并具有读/写权限。

String MEDIA_MOUNTED_READ_ONLY

解释:返回getExternalStorageState() ,表明对象权限为只读。
String MEDIA_NOFS
解释:返回getExternalStorageState() ,表明对象为空白或正在使用不受支持的文件系统。
String MEDIA_REMOVED
解释:返回getExternalStorageState() ,表明存储媒体被移除。
String MEDIA_SHARED
解释:返回getExternalStorageState() ,如果 SDCard 未安装 ,存储媒体正在通过USB共享
String MEDIA_UNMOUNTABLE
解释:返回getExternalStorageState() ,存储媒体无法挂载
String MEDIA_UNMOUNTED
解释:返回getExternalStorageState() ,存储媒体没有挂载
 
Environment 常用方法:
方法:getDataDirectory()
解释:返回 File ,获取 Android 数据目录。
方法:getDownloadCacheDirectory()
解释:返回 File ,获取 Android 下载/缓存内容目录。
方法:getExternalStorageDirectory()
解释:返回 File ,获取外部存储目录即 SDCard

方法:getExternalStoragePublicDirectory(String type)

解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件
方法:getExternalStorageState()
解释:返回 File ,获取外部存储设备的当前状态
方法:getRootDirectory()
解释:返回 File ,获取 Android 的根目录
 
3. 这里使用Environment.getExternalStorageDirectory()获得当前SD的目录,这是Google提供的获取外部存储SD卡目录的API,但是很多厂家往往自己设定SD卡的目录,
这样导致的结果就是:刚刚Environment.getExternalStorageDirectory()就不能有效找到SD卡的目录,所以通常有时候程序开发的时候,写入数据到SD卡的时候,开始会有几百行代码判断SD卡路径(穷举判断)
类似于:
   if() {
  ……
    }
  if() {
  ……
    }
  if() {
  ……
    }
 
3. 保存数据到手机内存之中:
(1)Context.getFilesDir():
保存文件到手机内存:data/data/包名/文件名
(2)Context.getCacheDir()
保存文件到手机内存:data/data/cache/文件名
 
4. 保存数据到SD 和 保存数据到内存之中的综合案例:
(1)新建一个 Android工程,如下:
 
 
(2)首先我们来到主布局文件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="com.himi.filetosd.MainActivity" >
  7. <LinearLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_marginTop="50dp"
  11. android:orientation="horizontal" >
  12. <TextView
  13. android:layout_width="0dp"
  14. android:layout_height="wrap_content"
  15. android:layout_weight="1"
  16. android:text="QQ账号"
  17. android:textSize="10sp"
  18. />
  19. <EditText
  20. android:id="@+id/et_qq"
  21. android:layout_width="0dp"
  22. android:layout_height="wrap_content"
  23. android:layout_weight="4"
  24. />
  25. </LinearLayout>
  26. <LinearLayout
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"
  29. android:layout_marginTop="20dp"
  30. android:orientation="horizontal" >
  31. <TextView
  32. android:layout_width="0dp"
  33. android:layout_height="wrap_content"
  34. android:layout_weight="1"
  35. android:text="QQ账号"
  36. android:textSize="10sp"
  37. />
  38. <EditText
  39. android:id="@+id/et_password"
  40. android:layout_width="0dp"
  41. android:layout_height="wrap_content"
  42. android:layout_weight="4"
  43. android:inputType="textPassword"
  44. />
  45. </LinearLayout>
  46. <LinearLayout
  47. android:layout_width="match_parent"
  48. android:layout_height="wrap_content"
  49. android:layout_marginTop="20dp"
  50. android:gravity="center_horizontal"
  51. android:orientation="horizontal" >
  52. <CheckBox
  53. android:layout_width="wrap_content"
  54. android:layout_height="wrap_content"
  55. android:id="@+id/checkbox"
  56. />
  57. <Button
  58. android:id="@+id/login"
  59. android:layout_width="wrap_content"
  60. android:layout_height="wrap_content"
  61. android:text="登录"
  62. />
  63. </LinearLayout>
  64. </LinearLayout>

布局效果图,如下:

(3)这里要使用的SD卡存储数据,需要添加相应的权限,如下:

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

(4)这里需要保存数据到手机内存 ,同时也需要保存数据到sd卡之中,这里我们特定写了一个工具类Tools:

  1. package com.himi.filetosd.utils;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import android.content.Context;
  8. import android.os.Environment;
  9. public class ToolsFile {
  10. public static final String FILE_NAME = "info.txt";
  11. /**
  12. * 保存文件到手机内存:data/data/包名/info.txt
  13. * @param context
  14. * @param username
  15. * @param password
  16. * @return
  17. */
  18. public static boolean saveFileToPackage(Context context, String username,
  19. String password) {
  20. File file = new File(context.getFilesDir(),FILE_NAME);
  21. try {
  22. FileWriter fw = new FileWriter(file);
  23. fw.write(username+":"+password);
  24. fw.close();
  25. } catch (IOException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. return false;
  29. }
  30. return true;
  31. }
  32. /**
  33. * 保存文件到手机内存:data/data/cache/info.txt
  34. * @param context
  35. * @param username
  36. * @param password
  37. * @return
  38. */
  39. public static boolean saveFileToCache(Context context, String username,
  40. String password) {
  41. File file = new File(context.getCacheDir(),FILE_NAME);
  42. try {
  43. FileWriter fw = new FileWriter(file);
  44. fw.write(username+":"+password);
  45. fw.close();
  46. } catch (IOException e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. return false;
  50. }
  51. return true;
  52. }
  53. /**
  54. * 删除data/data/包名/info.txt文件
  55. * @param context
  56. * @return
  57. */
  58. public static boolean delete(Context context) {
  59. File file = new File(context.getFilesDir(),FILE_NAME);
  60. return file.delete();
  61. }
  62. /**
  63. * 保存文件到SD:/mnt/sdcard
  64. */
  65. public static boolean saveFileToSD(Context context, String username,
  66. String password) {
  67. //判断sd有没有安装
  68. if(!Environment.getExternalStorageState()
  69. .equals(Environment.MEDIA_MOUNTED)) {
  70. return false;
  71. }
  72. File file = new File(Environment.getExternalStorageDirectory(),FILE_NAME);
  73. try {
  74. FileWriter fw = new FileWriter(file);
  75. fw.write(username+":"+password);
  76. fw.close();
  77. } catch (IOException e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. return false;
  81. }
  82. return true;
  83. }
  84. /**
  85. * 查询mnt/sdcard目录下info.txt文件信息,以字符串的形式反馈
  86. * @param context
  87. * @return
  88. */
  89. public static String findUser(Context context) {
  90. File file = new File(Environment.getExternalStorageDirectory(), FILE_NAME);
  91. // 如果文件不存在则返回 null
  92. if (!file.exists()) {
  93. return null;
  94. }
  95. String result = null;
  96. try {
  97. BufferedReader reader = new BufferedReader(new FileReader(file));
  98. result = reader.readLine();
  99. reader.close();
  100. } catch (Exception e) {
  101. e.printStackTrace();
  102. }
  103. return result;
  104. }
  105. }

(5)来到MainActivity,如下:

  1. package com.himi.filetosd;
  2. import com.himi.filetosd.utils.ToolsFile;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.text.TextUtils;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.CheckBox;
  10. import android.widget.EditText;
  11. import android.widget.Toast;
  12. public class MainActivity extends Activity {
  13. public static String qqCode = "10086";
  14. public static String passwordCode = "123456";
  15. private EditText et_qq;
  16. private EditText et_password;
  17. private CheckBox cb;
  18. private Button login;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. initViews();
  24. initEvents();
  25. String user = ToolsFile.findUser(this);
  26. if(user != null) {
  27. String[] split = user.split(":");
  28. et_qq.setText(split[0]);
  29. et_password.setText(split[1]);
  30. }
  31. }
  32. private void initEvents() {
  33. save.setOnClickListener(new OnClickListener() {
  34. @Override
  35. public void onClick(View v) {
  36. String qq = et_qq.getText().toString();
  37. String password = et_password.getText().toString();
  38. boolean checked = cb.isChecked();
  39. /*
  40. * 用户名和密码如果为空,则提示用户。
  41. */
  42. if (TextUtils.isEmpty(qq)) {
  43. Toast.makeText(MainActivity.this, "用户名不能为空!",
  44. Toast.LENGTH_SHORT).show();
  45. return ;
  46. }
  47. if (TextUtils.isEmpty(password)) {
  48. Toast.makeText(MainActivity.this, "密码不能为空! ",
  49. Toast.LENGTH_SHORT).show();
  50. return ;
  51. }
  52. if(qq.equals(qqCode) && password.equals(passwordCode)) {
  53. if (checked) {
  54. ToolsFile.saveFileToSD(MainActivity.this, qq, password);
  55. } else {
  56. ToolsFile.delete(MainActivity.this);
  57. }
  58. Toast.makeText(MainActivity.this, "登录成功 ",
  59. Toast.LENGTH_SHORT).show();
  60. } else {
  61. Toast.makeText(MainActivity.this, "登录失败 ",
  62. Toast.LENGTH_SHORT).show();
  63. }
  64. }
  65. });
  66. }
  67. private void initViews() {
  68. // TODO Auto-generated method stub
  69. et_qq = (EditText) findViewById(R.id.et_qq);
  70. et_password = (EditText) findViewById(R.id.et_password);
  71. cb = (CheckBox) findViewById(R.id.checkbox);
  72. login= (Button) findViewById(R.id.login);
  73. }
  74. }

(6)布署程序到模拟器上,如下:

  • 刚刚启动程序如下:

  • 输入错误的账号信息

  • 输入正确的账号信息

Android(java)学习笔记125:保存数据到SD卡 (附加:保存数据到内存)的更多相关文章

  1. java学习笔记06--正则表达式

    java学习笔记06--正则表达式 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆分.替换等操作. 例如:现在要去判断一个字符串是否由数字组成,则可以有以下的两种做法 不使用正则 ...

  2. Android(java)学习笔记182:保存数据到SD卡 (附加:保存数据到内存)

    1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...

  3. Java学习笔记:基本输入、输出数据操作实例分析

    Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 输出数据: JAVA中在屏幕中 ...

  4. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

  5. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  8. java学习笔记01--数据类型

    java学习笔记01--数据类型 java数据类型划分 分为两大类型: 1)基本数据类型:类似于普通的值. 2)引用数据类型:传递的是内存的地址. 浮点类型实际上就是表示小数. java基本数据类型 ...

  9. java学习笔记13--比较器(Comparable、Comparator)

    java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 ...

随机推荐

  1. HDU - 1078 FatMouse and Cheese(记忆化+dfs)

    FatMouse and Cheese FatMouse has stored some cheese in a city. The city can be considered as a squar ...

  2. ncnn添加自己的layer

    ncnn 是tencent公司开源的神经网络前向计算框架,github地址: https://github.com/Tencent/ncnn 通过简单的步骤可以添加自己的layer, 比如用位运算实现 ...

  3. ue4 character 物理测试

    charactor里 CapsuleComponnet Mesh CharacterMovement 3个组件里有有物理开关 目前看Mesh的Simulate Physics+Enable Gravi ...

  4. C 语言实例 - 输出九九乘法口诀表

    C 语言实例 - 输出九九乘法口诀表 使用嵌套 for 循环输出九九乘法口诀表. 实例 #include<stdio.h> int main(){ //外层循环变量,控制行 ; //内层循 ...

  5. C# 数组之ArrayList

    一.引言 ArrayList类相当于一种高级的动态数组,是Array类的升级版本. 一般的Array,底层是数组实现的,对于数据的查找和修改十分高效.但是有2个大的缺点,其一为增删低效,其二为数组长度 ...

  6. 51nod1244 欧拉函数之和 杜教筛

    和上一题差不多,一个是μ*I=e,一个是φ*I=Id 稍改就得到了这题的代码 (我会告诉你我一开始逆元算错了吗) #include <bits/stdc++.h> #define MAX ...

  7. hdu1494 跑跑卡丁车(动态规划)

    Description 跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种 加速卡,用这种加速卡可以在有限的时间里提高你的速度. ...

  8. Consul实现服务治理

    .NET Core微服务之基于Consul实现服务治理 https://www.cnblogs.com/edisonchou/p/9124985.html 一.Consul基础介绍 Consul是Ha ...

  9. App配置页面头部

    记录一下 App配置页面头部 例 上图红色框部分就是自己配置的头部 //我的客户 "/OACustomer/Index": { title: "我的客户", h ...

  10. JAVA基础之线程

    个人理解: 在相同的进程也就是运行同样的程序的前提下,线程越多效率越快!当然硬件也是个障碍!为了提高效率,可以多创建线程,但是也不是越多越好,这就需要了线程池进行管理!需要知道的线程实现的方法:继承T ...