简单的文本数据写入文件不需要权限,读写SD卡在4.0版本前需要写权限、在4.0后需要读写权限

布局:

 <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="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText android:id="@+id/et_number"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:phoneNumber="true"
android:hint="请输入手机号" /> <EditText
android:id="@+id/et_pwd"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:hint="请输入密码"
android:inputType="textPassword" /> <CheckBox android:id="@+id/cb_remerber_pwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="记住密码" /> <Button android:id="@+id/btn_Login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登陆"
/> </LinearLayout>

Manifest.xml添加权限

 <!-- 写入外部设备(sdka)的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

MainActivity:

 public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = "MainActivity";
private EditText etNumber;
private EditText etPwd;
private CheckBox cbRemerber; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件中数据
etNumber = (EditText)findViewById(R.id.et_number);
etPwd=(EditText)findViewById(R.id.et_pwd);
cbRemerber=(CheckBox)findViewById(R.id.cb_remerber_pwd);
Button btnLogin = (Button)findViewById(R.id.btn_Login);
//添加点击事件
btnLogin.setOnClickListener(this);
//获取SD卡数据
Map<String,String> userInfo=UtilsOfSDCard.getUserInfo(this);
if(userInfo!=null){
etNumber.setText(userInfo.get("number"));
etPwd.setText(userInfo.get("pwd"));
}
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//1.取出账号,密码
String Number=etNumber.getText().toString();
String Pwd=etPwd.getText().toString();
//判断是否有值,弹出吐司
if(TextUtils.isEmpty(Number) || TextUtils.isEmpty(Pwd)){
Toast.makeText(this, "请正确数据账号、密码", Toast.LENGTH_SHORT).show();
return;
}
//2.判断cb是否被选中
if(cbRemerber.isChecked()){
Log.i(TAG, "记住密码"+Number+","+Pwd);
boolean isSuccess=UtilsOfSDCard.saveUserInfo(this,Number, Pwd);
if(isSuccess)
Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();
} //3.登陆成功
Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
} }

UtilsOfSDCard类:

 public class UtilsOfSDCard {
//保存信息到sd卡
public static boolean saveUserInfo(Context context, String number,String pwd){
try {
//获取SD卡状态
String state=Environment.getExternalStorageState();
//判断SD卡状态
if(!Environment.MEDIA_MOUNTED.equals(state))
{
return false;
}
//动态获取SD卡路径
File sdCardFile = Environment.getExternalStorageDirectory();
File f=new File(sdCardFile,"qqLogin1.txt");
//写入流
FileOutputStream fos=new FileOutputStream(f); String data=number+"##"+pwd;
fos.write(data.getBytes());
fos.flush();
fos.close();
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return false;
} //返回信息
public static Map<String,String> getUserInfo(Context context){
try {
String state=Environment.getExternalStorageState();
if(!Environment.MEDIA_MOUNTED.equals(state))
{
return null;
}
File sdCartFile=Environment.getExternalStorageDirectory();
File f=new File(sdCartFile,"qqLogin1.txt");
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
String text=br.readLine();
br.close();
if(!TextUtils.isEmpty(text)){
Map<String,String> userInfoMap=new HashMap<String,String>();
String[] split = text.split("##");
userInfoMap.put("number", split[0]);
userInfoMap.put("pwd", split[1]);
Log.w("UtilsOfSDCard", split[0]+","+split[1]);
return userInfoMap;
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
}
}

Utils类:

 public class Utils {
/*
* 保存用户信息
* */
public static boolean saveUserInfo(String number,String pwd){ try {
String path="/data/data/com.cui.qqlogin/QQLogin.txt";
//写入流
FileOutputStream fs=new FileOutputStream(path);
String data=number+"##"+pwd;
fs.write(data.getBytes());
fs.flush();
fs.close();
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return false;
} public static boolean saveUserInfo(Context context, String number,String pwd){ try {
//动态获取文件路径
File filesDir = context.getFilesDir();
File f=new File(filesDir,"QQLogin.txt");
//写入流
FileOutputStream fs=new FileOutputStream(f);
String data=number+"##"+pwd;
fs.write(data.getBytes());
fs.flush();
fs.close();
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return false;
} public static Map<String,String> getUserInfo(){
try {
String path="/data/data/com.cui.qqlogin/QQLogin.txt";
//输出流
FileInputStream fis=new FileInputStream(path);
//字符流
BufferedReader reader=new BufferedReader(new InputStreamReader(fis));
String text = reader.readLine();
if(!TextUtils.isEmpty(text)){
String[] split=text.split("##");
Map<String,String> userofMap=new HashMap<String,String>();
userofMap.put("number", split[0]);
userofMap.put("pwd", split[1]);
return userofMap;
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
} public static Map<String,String> getUserInfo(Context context){
try {
//String path="/data/data/com.cui.qqlogin/QQLogin.txt";
//动态获取文件路径
File filesDir = context.getFilesDir();
File f=new File(filesDir,"QQLogin.txt");
//输出流
FileInputStream fis=new FileInputStream(f);
//字符流
BufferedReader reader=new BufferedReader(new InputStreamReader(fis));
String text = reader.readLine();
reader.close();
if(!TextUtils.isEmpty(text)){
String[] split=text.split("##");
Map<String,String> userofMap=new HashMap<String,String>();
userofMap.put("number", split[0]);
userofMap.put("pwd", split[1]);
return userofMap;
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
}
}

====================插播快捷键

Ctrl+N 快速新建
Ctrl+H 选中项目中搜索
Ctrl+L 跳转到指定行
Ctrl+F 在文本中查找内容

====================

文件存储地址:

this.getFilesDir(); // /data/data/包名/files
this.getCacheDir(); // /data/data/包名/cache
openFileOutput("aa.txt", 0); /data/data/包名/files/aa.txt
context.getSharedPreferences("cuidemo", context.MODE_PRIVATE); /data/data/包名/shared_prefs/cuidemo.xml

 public class UtilsOfSharedPreferences {
//保存信息到sd卡
public static boolean saveUserInfo(Context context, String number,String pwd){
try {
sp=context.getSharedPreferences("cuidemo", context.MODE_PRIVATE);
//获得一个编辑对象
Editor edit = sp.edit();
edit.putString("number", number);
edit.putString("pwd", pwd);
edit.commit();
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
} //返回信息
public static Map<String,String> getUserInfo(Context context){
SharedPreferences sp=context.getSharedPreferences("cuidemo", context.MODE_PRIVATE);
String number=sp.getString("number", null);
String pwd=sp.getString("pwd", null); if(!TextUtils.isEmpty(number)&& !TextUtils.isEmpty(pwd)){
Map<String,String> userInfoMap=new HashMap<String,String>();
userInfoMap.put("number", number);
userInfoMap.put("pwd", pwd);
return userInfoMap;
} return null;
}
}

权限相关:
1. 私有文件
Context.MODE_PRIVATE
2. 可读文件
Context.MODE_WORLD_READABLE
3. 可写文件
Context.MODE_WORLD_WRITEABLE
4. 可读可写文件.
Context.MODE_WORLD_WRITEABLE+Context.MODE_WORLD_READABLE

权限二进制图解:

基础学习总结(三)--文本、SD卡数据读写的更多相关文章

  1. JavaScript 基础 学习(三)

    JavaScript 基础 学习(三) 事件三要素 ​ 1.事件源: 绑定在谁身上的事件(和谁约定好) ​ 2.事件类型: 绑定一个什么事件 ​ 3.事件处理函数: 当行为发生的时候,要执行哪一个函数 ...

  2. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(三)-SD卡的操作流程

    其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...

  3. 使用STM32F103ZET霸道主板实现SD卡的读写(非文件系统)

    了解STM32F103ZET是高容量多管脚的芯片 了解SD读写线路图 了解SD的基地址 阅读STM32F10xx英文参考 SDIO那章,我们编写代码边看文档解析 建工程,打开包含所有包括外设库函数的样 ...

  4. 【译】如何在 Android 5.0 上获取 SD卡 的读写权限

    因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...

  5. SD卡spi读写流程

    SD卡spi读写流程 1.SD卡的命令格式: SD卡的指令由6字节(Byte)组成,如下: Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x ...

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

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

  7. 用 S5PV210 学习 Linux (三) SD卡下载

    学习地址:http://edu.51cto.com/lesson/id-63015.html http://blog.csdn.net/karven_/article/details/52015325 ...

  8. 基于stm32f103zet6的FAT16文件系统学习0(读SD卡扇区)

    SD卡已经看了两天了,主要是因为测试出来的卡容量不对,所以一直找原因,最终还是发现了,总比不过是单位上面出现了问题,或许是之前没有接触到SD的缘故吧,所以对其中的一些寄存器很不了解,一切都是重新开始, ...

  9. java网络爬虫基础学习(三)

    尝试直接请求URL获取资源 豆瓣电影 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort= ...

随机推荐

  1. jquery hasClass()、is() 多个

    一..hasClass() hasClass()方法是用来检查被选择的元素是否包含指定的class名,其语法: $(selector).hasClass("className"); ...

  2. linux之centos安装xampp

    一.xampp下载地址: http://downloads.sourceforge.net/project/xampp/XAMPP%20Linux/5.5.19/xampp-linux-x64-5.5 ...

  3. discuz常用变量

    帖子URL: {url}帖子标题: {title}附件图片: {pic}帖子内容: {summary}楼主: {author}楼主UID: {authorid}楼主头像: {avatar}楼主头像(中 ...

  4. MySQL中的WITH ROLLUP

    MySQL中的WITH ROLLUP MySQL的扩展SQL中有一个非常有意思的应用WITH ROLLUP,在分组的统计数据的基础上再进行相同的统计(SUM,AVG,COUNT…),非常类似于Orac ...

  5. uboot_starts_analysis.pdf

    Uboot中start.S源码的指令级的详尽解析 HTML版本的在线地址为:http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/ ...

  6. C# 之 静态字段初始化

          当一个字段声明中含有 static 修饰符时,由该声明引入的字段为静态字段(静态变量).当不存在 static 修饰符时,由该声明引入的字段为实例字段(实例变量).       静态字段不 ...

  7. Java基础知识强化之网络编程笔记23:Android网络通信之 Volley(Google开源网络通信库)

    联合网上资料学习:http://www.open-open.com/lib/view/open1451223702339.html 一.Volley的介绍 1. Volley简介 在这之前,我们在程序 ...

  8. oracle数据字典和动态性能视图

    数据字典和动态性能视图数据字典是oracle数据库中重要的组成部分,提高了数据库的一些系统信息.(静态信息)动态性能视图记载了例程启动后的信息.(动态信息) 数据字典记录了数据的系统信息,是只读表和动 ...

  9. SQLServer-镜像配置

    实验环境:三台服务器分别为主服务器,镜像服务器,见证服务器,都加入域sql.com 1. 分别在三台服务器上安装SQL 2008 R2,安装数据库引擎和管理工具两个组件即可. 2. 镜像前准备工作. ...

  10. hdu 2665 划分树

    思路:裸的划分树 #include<iostream> #include<algorithm> #include<cstring> #include<cstd ...