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

布局:

  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="wrap_content"
  5. android:orientation="vertical"
  6. tools:context=".MainActivity" >
  7.  
  8. <EditText android:id="@+id/et_number"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:phoneNumber="true"
  12. android:hint="请输入手机号" />
  13.  
  14. <EditText
  15. android:id="@+id/et_pwd"
  16. android:layout_width="fill_parent"
  17. android:layout_height="match_parent"
  18. android:hint="请输入密码"
  19. android:inputType="textPassword" />
  20.  
  21. <CheckBox android:id="@+id/cb_remerber_pwd"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:checked="true"
  25. android:text="记住密码" />
  26.  
  27. <Button android:id="@+id/btn_Login"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:text="登陆"
  31. />
  32.  
  33. </LinearLayout>

Manifest.xml添加权限

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

MainActivity:

  1. public class MainActivity extends Activity implements OnClickListener {
  2. private static final String TAG = "MainActivity";
  3. private EditText etNumber;
  4. private EditText etPwd;
  5. private CheckBox cbRemerber;
  6.  
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. //获取控件中数据
  12. etNumber = (EditText)findViewById(R.id.et_number);
  13. etPwd=(EditText)findViewById(R.id.et_pwd);
  14. cbRemerber=(CheckBox)findViewById(R.id.cb_remerber_pwd);
  15. Button btnLogin = (Button)findViewById(R.id.btn_Login);
  16. //添加点击事件
  17. btnLogin.setOnClickListener(this);
  18. //获取SD卡数据
  19. Map<String,String> userInfo=UtilsOfSDCard.getUserInfo(this);
  20. if(userInfo!=null){
  21. etNumber.setText(userInfo.get("number"));
  22. etPwd.setText(userInfo.get("pwd"));
  23. }
  24. }
  25.  
  26. @Override
  27. public void onClick(View v) {
  28. // TODO Auto-generated method stub
  29. //1.取出账号,密码
  30. String Number=etNumber.getText().toString();
  31. String Pwd=etPwd.getText().toString();
  32. //判断是否有值,弹出吐司
  33. if(TextUtils.isEmpty(Number) || TextUtils.isEmpty(Pwd)){
  34. Toast.makeText(this, "请正确数据账号、密码", Toast.LENGTH_SHORT).show();
  35. return;
  36. }
  37. //2.判断cb是否被选中
  38. if(cbRemerber.isChecked()){
  39. Log.i(TAG, "记住密码"+Number+","+Pwd);
  40. boolean isSuccess=UtilsOfSDCard.saveUserInfo(this,Number, Pwd);
  41. if(isSuccess)
  42. Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
  43. else
  44. Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();
  45. }
  46.  
  47. //3.登陆成功
  48. Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
  49. }
  50.  
  51. }

UtilsOfSDCard类:

  1. public class UtilsOfSDCard {
  2. //保存信息到sd卡
  3. public static boolean saveUserInfo(Context context, String number,String pwd){
  4. try {
  5. //获取SD卡状态
  6. String state=Environment.getExternalStorageState();
  7. //判断SD卡状态
  8. if(!Environment.MEDIA_MOUNTED.equals(state))
  9. {
  10. return false;
  11. }
  12. //动态获取SD卡路径
  13. File sdCardFile = Environment.getExternalStorageDirectory();
  14. File f=new File(sdCardFile,"qqLogin1.txt");
  15. //写入流
  16. FileOutputStream fos=new FileOutputStream(f);
  17.  
  18. String data=number+"##"+pwd;
  19. fos.write(data.getBytes());
  20. fos.flush();
  21. fos.close();
  22. return true;
  23. } catch (Exception e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27.  
  28. return false;
  29. }
  30.  
  31. //返回信息
  32. public static Map<String,String> getUserInfo(Context context){
  33. try {
  34. String state=Environment.getExternalStorageState();
  35. if(!Environment.MEDIA_MOUNTED.equals(state))
  36. {
  37. return null;
  38. }
  39. File sdCartFile=Environment.getExternalStorageDirectory();
  40. File f=new File(sdCartFile,"qqLogin1.txt");
  41. BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
  42. String text=br.readLine();
  43. br.close();
  44. if(!TextUtils.isEmpty(text)){
  45. Map<String,String> userInfoMap=new HashMap<String,String>();
  46. String[] split = text.split("##");
  47. userInfoMap.put("number", split[0]);
  48. userInfoMap.put("pwd", split[1]);
  49. Log.w("UtilsOfSDCard", split[0]+","+split[1]);
  50. return userInfoMap;
  51. }
  52.  
  53. } catch (Exception e) {
  54. // TODO Auto-generated catch block
  55. e.printStackTrace();
  56. }
  57.  
  58. return null;
  59. }
  60. }

Utils类:

  1. public class Utils {
  2. /*
  3. * 保存用户信息
  4. * */
  5. public static boolean saveUserInfo(String number,String pwd){
  6.  
  7. try {
  8. String path="/data/data/com.cui.qqlogin/QQLogin.txt";
  9. //写入流
  10. FileOutputStream fs=new FileOutputStream(path);
  11. String data=number+"##"+pwd;
  12. fs.write(data.getBytes());
  13. fs.flush();
  14. fs.close();
  15. return true;
  16. } catch (Exception e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20.  
  21. return false;
  22. }
  23.  
  24. public static boolean saveUserInfo(Context context, String number,String pwd){
  25.  
  26. try {
  27. //动态获取文件路径
  28. File filesDir = context.getFilesDir();
  29. File f=new File(filesDir,"QQLogin.txt");
  30. //写入流
  31. FileOutputStream fs=new FileOutputStream(f);
  32. String data=number+"##"+pwd;
  33. fs.write(data.getBytes());
  34. fs.flush();
  35. fs.close();
  36. return true;
  37. } catch (Exception e) {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. }
  41.  
  42. return false;
  43. }
  44.  
  45. public static Map<String,String> getUserInfo(){
  46. try {
  47. String path="/data/data/com.cui.qqlogin/QQLogin.txt";
  48. //输出流
  49. FileInputStream fis=new FileInputStream(path);
  50. //字符流
  51. BufferedReader reader=new BufferedReader(new InputStreamReader(fis));
  52. String text = reader.readLine();
  53. if(!TextUtils.isEmpty(text)){
  54. String[] split=text.split("##");
  55. Map<String,String> userofMap=new HashMap<String,String>();
  56. userofMap.put("number", split[0]);
  57. userofMap.put("pwd", split[1]);
  58. return userofMap;
  59. }
  60.  
  61. } catch (Exception e) {
  62. // TODO Auto-generated catch block
  63. e.printStackTrace();
  64. }
  65.  
  66. return null;
  67. }
  68.  
  69. public static Map<String,String> getUserInfo(Context context){
  70. try {
  71. //String path="/data/data/com.cui.qqlogin/QQLogin.txt";
  72. //动态获取文件路径
  73. File filesDir = context.getFilesDir();
  74. File f=new File(filesDir,"QQLogin.txt");
  75. //输出流
  76. FileInputStream fis=new FileInputStream(f);
  77. //字符流
  78. BufferedReader reader=new BufferedReader(new InputStreamReader(fis));
  79. String text = reader.readLine();
  80. reader.close();
  81. if(!TextUtils.isEmpty(text)){
  82. String[] split=text.split("##");
  83. Map<String,String> userofMap=new HashMap<String,String>();
  84. userofMap.put("number", split[0]);
  85. userofMap.put("pwd", split[1]);
  86. return userofMap;
  87. }
  88.  
  89. } catch (Exception e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. }
  93.  
  94. return null;
  95. }
  96. }

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

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

  1. public class UtilsOfSharedPreferences {
  2. //保存信息到sd卡
  3. public static boolean saveUserInfo(Context context, String number,String pwd){
  4. try {
  5. sp=context.getSharedPreferences("cuidemo", context.MODE_PRIVATE);
  6. //获得一个编辑对象
  7. Editor edit = sp.edit();
  8. edit.putString("number", number);
  9. edit.putString("pwd", pwd);
  10. edit.commit();
  11. return true;
  12. } catch (Exception e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }
  16. return false;
  17. }
  18.  
  19. //返回信息
  20. public static Map<String,String> getUserInfo(Context context){
  21. SharedPreferences sp=context.getSharedPreferences("cuidemo", context.MODE_PRIVATE);
  22. String number=sp.getString("number", null);
  23. String pwd=sp.getString("pwd", null);
  24.  
  25. if(!TextUtils.isEmpty(number)&& !TextUtils.isEmpty(pwd)){
  26. Map<String,String> userInfoMap=new HashMap<String,String>();
  27. userInfoMap.put("number", number);
  28. userInfoMap.put("pwd", pwd);
  29. return userInfoMap;
  30. }
  31.  
  32. return null;
  33. }
  34. }

权限相关:
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. 关于dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的分发机制浅析

    虽说这个问题不是很难...动动手就能看出答案...但是似乎不太容易理解...几次尝试把这个问题说明白....但是好像感觉说不明白....(顿时想起了那句话----说不明白就是自己还不明白! 我怎么可能 ...

  2. hdu1051 Wooden Sticks

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1051 大意:求最少升序序列的个数. #include <cstdio> #include &l ...

  3. github使用成长记

    学校里一直都有自己写一些网页,一方面为了学习熟练技能,另一方面也是兴趣所在.但是独乐乐不如众乐乐,一直向往有那么一个平台能把自己做得东西分享给广大网友,并且想借着分享的契机和各位程序猿交流学习心得(这 ...

  4. ArcGIS: version not specified. You must call RuntimeManager.Bind before creat

    打开program.cs把ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);这句放到Applicatio ...

  5. Flask的部署

    当前对部署flask的一些学习: 1.全局安装nginx 1.1 nginx的配置文件怎么写? $ sudo rm /etc/nginx/sites-enabled/default $ sudo to ...

  6. Halcon C++混合编程学习之Qt 实现检测焊接点

    1 # include "HalconCpp.h" # include "HDevThread.h" # include <X11/Xlib.h> ...

  7. 关于Windows常用命令

    本文引用自:http://ylbook.com/cms/computer/mingling.htm Windows Run命令: calc———–启动计算器certmgr.msc—-证书管理实用程序c ...

  8. 历经曲折的freescale

    从来没有想到自己在大学最信任的队友会突然放弃,,为了这个,,我可以说放弃了很多,,这几天可以我也不知道怎么办了,,我想不通的是为什么可以这样,为什么可以这么不负责任,,为什么这么自私,,这些我永远都不 ...

  9. 【基础数学知识】UVa 11314 - Hardly Hard

    Problem H HARDLY HARD You have been given the task of cutting out a quadrilateral slice of cake out ...

  10. Ehcache(2.9.x) - API Developer Guide, Cache Usage Patterns

    There are several common access patterns when using a cache. Ehcache supports the following patterns ...