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,如下:
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.himi.filetosd.MainActivity" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:orientation="horizontal" >
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="QQ账号"
android:textSize="10sp"
/>
<EditText
android:id="@+id/et_qq"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
/>
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal" >
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="QQ账号"
android:textSize="10sp"
/>
<EditText
android:id="@+id/et_password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:inputType="textPassword"
/>
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox"
/>
<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
/>
</LinearLayout> </LinearLayout>

布局效果图,如下:

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

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

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

 package com.himi.filetosd.utils;

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; import android.content.Context;
import android.os.Environment; public class ToolsFile { public static final String FILE_NAME = "info.txt";
/**
* 保存文件到手机内存:data/data/包名/info.txt
* @param context
* @param username
* @param password
* @return
*/
public static boolean saveFileToPackage(Context context, String username,
String password) {
File file = new File(context.getFilesDir(),FILE_NAME);
try {
FileWriter fw = new FileWriter(file);
fw.write(username+":"+password);
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
} /**
* 保存文件到手机内存:data/data/cache/info.txt
* @param context
* @param username
* @param password
* @return
*/
public static boolean saveFileToCache(Context context, String username,
String password) {
File file = new File(context.getCacheDir(),FILE_NAME);
try {
FileWriter fw = new FileWriter(file);
fw.write(username+":"+password);
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
} /**
* 删除data/data/包名/info.txt文件
* @param context
* @return
*/
public static boolean delete(Context context) {
File file = new File(context.getFilesDir(),FILE_NAME);
return file.delete();
} /**
* 保存文件到SD:/mnt/sdcard
*/
public static boolean saveFileToSD(Context context, String username,
String password) {
//判断sd有没有安装
if(!Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)) {
return false;
} File file = new File(Environment.getExternalStorageDirectory(),FILE_NAME);
try {
FileWriter fw = new FileWriter(file);
fw.write(username+":"+password);
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} return true;
} /**
* 查询mnt/sdcard目录下info.txt文件信息,以字符串的形式反馈
* @param context
* @return
*/
public static String findUser(Context context) {
File file = new File(Environment.getExternalStorageDirectory(), FILE_NAME);
// 如果文件不存在则返回 null
if (!file.exists()) {
return null;
}
String result = null;
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
result = reader.readLine();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
} }

(5)来到MainActivity,如下:

 package com.himi.filetosd;

 import com.himi.filetosd.utils.ToolsFile;

 import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity {
public static String qqCode = "10086";
public static String passwordCode = "123456"; private EditText et_qq;
private EditText et_password;
private CheckBox cb;
private Button login; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initViews();
initEvents(); String user = ToolsFile.findUser(this);
if(user != null) {
String[] split = user.split(":");
et_qq.setText(split[0]);
et_password.setText(split[1]);
}
} private void initEvents() {
save.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
String qq = et_qq.getText().toString();
String password = et_password.getText().toString();
boolean checked = cb.isChecked(); /*
* 用户名和密码如果为空,则提示用户。
*/
if (TextUtils.isEmpty(qq)) {
Toast.makeText(MainActivity.this, "用户名不能为空!",
Toast.LENGTH_SHORT).show();
return ;
}
if (TextUtils.isEmpty(password)) {
Toast.makeText(MainActivity.this, "密码不能为空! ",
Toast.LENGTH_SHORT).show();
return ;
} if(qq.equals(qqCode) && password.equals(passwordCode)) {
if (checked) {
ToolsFile.saveFileToSD(MainActivity.this, qq, password);
} else {
ToolsFile.delete(MainActivity.this);
}
Toast.makeText(MainActivity.this, "登录成功 ",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "登录失败 ",
Toast.LENGTH_SHORT).show();
} }
}); } private void initViews() {
// TODO Auto-generated method stub
et_qq = (EditText) findViewById(R.id.et_qq);
et_password = (EditText) findViewById(R.id.et_password);
cb = (CheckBox) findViewById(R.id.checkbox);
login= (Button) findViewById(R.id.login); } }

(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. oracle查看监听状态

    产看状态命令:lsnrctl status 启动监听:lsnrctl start 关闭监听:lsnrctl stop LSNRCTL for 32-bit Windows: Version 10.2. ...

  2. VMware S/4 HANA OP 1511虚拟机下载,64G内存限制解决方案

    http://www.itpub.net/thread-2057212-1-1.html S4 HANA OP 1511 Scale Out

  3. 初识Kotlin之集合

    Kotlin的集合是让我为之心动的地方,丰富的高阶函数帮助我们高效开发.今天介绍Kotlin的基础集合用法.获取集合元素的函数.过滤元素的函数.元素排序的函数.元素统计的函数.集合元素映射的函数.集合 ...

  4. 宽度设置百分比 高度跟宽度一样css解决方案

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

  5. 洛谷P3003 [USACO10DEC]苹果交货Apple Delivery

    P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of her f ...

  6. React入门看这篇就够了

    摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所有. React 背景介绍 React 入门实例教程 React 起源于 ...

  7. 用户唯一性验证(ajax)

    验证用户添加或者修改时用户名的唯一性: 验证时机:用户名改变时,表单提交时. 1.jsp页面:(前端) <%@ page contentType="text/html;charset= ...

  8. Unity---协程的简单使用

    1.作用 协程的作用一共有两点: 延时执行代码. 在某项操作完后再执行代码. 就是控制代码在特性的时间执行. 2.协程和线程的区别 协程不是异步,不需要考虑同步和锁问题 线程避免了无意义的调度,提高了 ...

  9. [bzoj 1758] 重建计划

    bzoj 1758 重建计划 题意: 给定一棵有边权的树和两个数 \(L, R (L\leq R)\),求一条简单路径,使得这条路径经过的边数在 \(L, R\) 之间且路径经过的边的边权的平均值最大 ...

  10. 3.Freshman阶段学习内容的确定

    我刷知乎.在知乎上答题的程序员,不是很牛逼就是更牛逼,说起各种系统.各种系统的各种版本.各种语言.数据库.算法.IT届的各种圣战都有板有眼.信手拈来.头头是道,不得不服.这导致了一些非常严重的问题:我 ...