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. js中“||”和“&&”的高级用法

    例1:用于赋值&&:从左往右依次判断,当当前值为true则继续,为false则返回此值(是返回未转换为布尔值时的原值哦)|| : 从左往右依次判断,当当前值为false则继续,为tru ...

  2. 二十五种网页加速方法和seo优化技巧

    一.使用良好的结构 可扩展 HTML (XHTML) 具有许多优势,但是其缺点也很明显.XHTML 可能使您的页面更加符合标准,但是它大量使用标记(强制性的 <start> 和 <e ...

  3. CSP 201703-4 地铁修建 最小生成树+并查集

    地铁修建   试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力, ...

  4. ]Linq to EF 增删改查

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  5. 洛谷P1074 靶形数独(跳舞链)

    传送门 坑着,等联赛之后再填(联赛挂了就不填了233) //minamoto #include<iostream> #include<cstdio> #include<c ...

  6. javascript的程序控制结构及语句------(2)循环控制语句、跳转语句、对话框

    一.循环控制语句 循环语句主要就是在满足条件的情况下反复执行某一个操作,循环控制语句主要包括while语句.do...while语句 和for语句. 1.While语句 语法: While(条件表达式 ...

  7. 十、正则表达式和JSON

    一.什么是正则表达式 正则表达式是一个特殊字符序列,一个字符串是否与我们所设定的这样的字符序列相匹配. 应用:快速检索文本.实现一些替换文本的操作 1.检查一串数字是否是电话号码 2.检查一个字符串是 ...

  8. SAP中对于获取订单的状态

    在SAP中对于如何获取订单的状态,提供了至少两个函数,分别是 STATUS_READ 和   STATUS_TEXT_EDIT.下面简单介绍这两个函数 1.STATUS_READ  改函数的实现原理大 ...

  9. thinkphp5使用前置后置操作

    下面举个例子,前置删除的例子   模型事件只可以在调用模型的方法才能生效,使用查询构造器通过Db类操作是无效的   控制器中实例化类   $cate=model('cate'); $cate-> ...

  10. MyEclipse 2016CI破解版for Mac

    网上的教程很多,一开始怎么都不行,就是不行,也是如此操作,可能是注册机失效了还是怎样,数个小时过去了,我综合了网上的资源,终于OK啦!(我会在文后给出jar 包,注册机的破解文件,以及MyEclips ...