Android 第二章 本地文件的读写_liuhenghui5201的博客-程序员宅基地_android 本地写文件

技术标签: Andriod  

 

  1. 读写的第一种方式:
    使用最初始的IO方式读写到应用包目录下面
package com.example.login;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class UserUtils {
	
	/**
	 * 保存用户名密码到本地文件中 位置放在app应用包下
	 * @param username
	 * @param passwd
	 * @return
	 */
	public static boolean saveUserinfo(String username,String passwd){
		try {
			String info =  username +"##"+ passwd;
			File file = new File("/data/data/com.example.login/info.txt");
			FileOutputStream outputStream = new FileOutputStream(file);
			outputStream.write(info.getBytes());
			outputStream.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 从app应用包路径下读取文件中信息
	 * @return
	 */
	public static Map<String,String> readUserinfo(){
		try {
			Map map = new HashMap<String,String>();
			File file = new File("/data/data/com.example.login/info.txt");
			FileInputStream inputStream = new FileInputStream(file);
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
			String info = bufferedReader.readLine();
			String[] userinfos = info.split("##");
			map.put("username", userinfos[0]);
			map.put("passwd", userinfos[1]);
			return map;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}

2,对版本一进行优化,使用Context上下文环境获取应用包路径进行获取文件路径以及使用新的API在SD卡上操作数据读写
     相关主要API:
     public abstract class Context extends Object
     public abstract File getFilesDir () //获取应用包路径
     public abstract FileOutputStream openFileOutput (String name, int mode) //在应用包中打开一个文件进行准备写入操作,如果文件不存在则进行创建。
     public abstract FileInputStream openFileInput (String name)//在应用包中打开一个文件进行读操作。不能有文件分隔符。
     public class  Environment extends Object
     public static File getExternalStorageDirectory () //获取存储卡目录位置
     public static String getExternalStorageState ()   //获取存储卡状态

package com.example.login;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.os.Environment;

public class UserUtils4Context {
	
	/**
	 * 使用上下文环境context API 获取文件目录位置
	 * @param context
	 * @param username
	 * @param passwd
	 * @return
	 */
	public static boolean saveUserinfo(Context context,String username,String passwd){
		try {
			String info =  username +"##"+ passwd;
			String path = context.getFilesDir().getPath();
			
			File file = new File(path,"info.txt");
			FileOutputStream outputStream = new FileOutputStream(file);
			outputStream.write(info.getBytes());
			outputStream.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 从目录com.example.package/info.txt中读取文件信息
	 * @param context
	 * @return
	 */
	public static Map<String,String> readUserinfo(Context context){
		try {
			Map map = new HashMap<String,String>();
			String path = context.getFilesDir().getPath();
			File file = new File(path,"info.txt");
			FileInputStream inputStream = new FileInputStream(file);
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
			String info = bufferedReader.readLine();
			String[] userinfos = info.split("##");
			map.put("username", userinfos[0]);
			map.put("passwd", userinfos[1]);
			return map;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	/**
	 * 优化版 context.openFileOutput 此API会在应用包目录下面创建一个files文件夹 将文件保存在此文件夹中
	 * data/data/com.example.package/files/contextinfo.txt
	 * @param context
	 * @param username
	 * @param passwd
	 * @return
	 */
	public static boolean saveUserinfo2(Context context,String username,String passwd){
		try {
			String info =  username +"##"+ passwd;
			FileOutputStream outputStream = context.openFileOutput("contextinfo.txt",0);
			outputStream.write(info.getBytes());
			outputStream.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 优化版 从 data/data/com.example.package/files/contextinfo.txt中读取数据
	 * @param context
	 * @return
	 */
	public static Map<String,String> readUserinfo2(Context context){
		try {
			Map map = new HashMap<String,String>();
			
			FileInputStream inputStream = context.openFileInput("contextinfo.txt");
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
			String info = bufferedReader.readLine();
			String[] userinfos = info.split("##");
			map.put("username", userinfos[0]);
			map.put("passwd", userinfos[1]);
			return map;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	/**
	 * 通过使用 Environment API 将数据保存到sd卡
	 * @param context
	 * @param username
	 * @param passwd
	 * @return
	 */
	public static boolean saveUserinfo2sdCard(String username,String passwd){
		try {
			String info =  username +"##"+ passwd;
			String path = Environment.getExternalStorageDirectory().getPath();
			File file = new File(path,"sdcard.txt");
			FileOutputStream outputStream = new FileOutputStream(file);
			outputStream.write(info.getBytes());
			outputStream.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 通过使用 Environment API 从sd卡上读取数据
	 * @return
	 */
	public static Map<String,String> readUserinfoFromSdCard(){
		try {
			Map map = new HashMap<String,String>();
			
			File file = new File(Environment.getExternalStorageDirectory().getPath(),"sdcard.txt");
			FileInputStream inputStream = new FileInputStream(file);
			
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
			String info = bufferedReader.readLine();
			String[] userinfos = info.split("##");
			map.put("username", userinfos[0]);
			map.put("passwd", userinfos[1]);
			return map;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}

3,使用SharedPreferences实现文件的读写
  主要操作步骤,写入:1,获取sp实例 2,获取编辑器;3,添加数据;4,提交数据。
                           读:    1,获取sp实例;2根据key获取value;

package com.example.login;

import com.example.loginuseSp.R;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

	private EditText etUserName;
	private EditText etUserPasswd;
	private CheckBox cbIsRem;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		 etUserName =  (EditText)findViewById(R.id.et_username);
		 etUserPasswd =  (EditText)findViewById(R.id.et_userpasswd);
		 cbIsRem =  (CheckBox)findViewById(R.id.cb_isrem);
		//获取实例
		 SharedPreferences sp = getSharedPreferences("config", 0);
		 String name = sp.getString("name","");
		 String passwd = sp.getString("passwd","");
		 Boolean isCk = sp.getBoolean("isCk",false);
		 if(isCk){
			 etUserName.setText(name);
			 etUserPasswd.setText(passwd);
			 cbIsRem.setChecked(true);
		 }
		 
		 
	}
	
	public void loginClick(View v){
		String userName = etUserName.getText().toString().trim();
		String passWd = etUserPasswd.getText().toString().trim();
		if(TextUtils.isEmpty(userName)|| TextUtils.isEmpty(passWd)){
			Toast.makeText(MainActivity.this, "用户名密码不能为空", 1).show();
		}else{
			Toast.makeText(MainActivity.this, "登录成功", 1).show();
			CheckBox checkBox = (CheckBox)findViewById(R.id.cb_isrem);
			//获取实例
			SharedPreferences sp = getSharedPreferences("config", 0);
			//获取编辑器
			Editor edit = sp.edit();
			if(checkBox.isChecked()){
				boolean result = false;
				//存储数据
				edit.putString("name", userName);
				edit.putString("passwd", passWd);
				edit.putBoolean("isCk", true);
				if(result){
					Toast.makeText(MainActivity.this, "保存成功", 1).show();
				}else{
					Toast.makeText(MainActivity.this, "保存失败", 1).show();
				}
			}else{
				edit.putBoolean("isCk", false);
			}
			//提交数据
			edit.commit();
		}
	}
}

4,android 实现XML的 读写操作
 

package com.example.createxml;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	/**
	 * 模拟获取数据
	 * @return
	 */
	private List<Sms> getList(){
		ArrayList<Sms> smss = new ArrayList<Sms>(); 
		Sms sms = new Sms("10086","20180903","您的话费余额1209");
		Sms sms2 = new Sms("95599","20180803","您的银行卡余额1209000");
		Sms sms3 = new Sms("12306","20170813","您的购票成功");
		smss.add(sms);
		smss.add(sms2);
		smss.add(sms3);
		return smss;
	}
	
	public void readXML(View v){
		try {
			List<Sms> parserXml = parserXml(getAssets().open("fxml.xml"));
			TextView tv = (TextView)findViewById(R.id.tv_text);
			tv.setText(parserXml.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 创建一个XML文件点击事件
	 * @param v
	 */
	public void createXML(View v){
		
		XmlSerializer serializer = Xml.newSerializer();
		File file = new File(Environment.getExternalStorageDirectory().getPath(),"fxml.xml");
		List<Sms> smsList = getList();
		try {
			FileOutputStream fos = new FileOutputStream(file);
			serializer.setOutput(fos, "utf-8");
			serializer.startDocument("utf-8", true);
			
			serializer.startTag(null, "smss");
			for (Sms sms : smsList) {
				serializer.startTag(null, "sms");
				serializer.attribute(null, "id", sms.getAddress());
				
				serializer.startTag(null, "address");
				serializer.text(sms.getAddress());
				serializer.endTag(null, "address");
				serializer.startTag(null, "date");
				serializer.text(sms.getDate());
				serializer.endTag(null, "date");
				serializer.startTag(null, "content");
				serializer.text(sms.getContent());
				serializer.endTag(null, "content");
				
				serializer.endTag(null, "sms");
			}
			serializer.endTag(null,"smss");
			
			serializer.endDocument();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 解析xml
	 * @param stream
	 * @return
	 */
	public List<Sms> parserXml(InputStream stream){
		
		XmlPullParser pullParser = Xml.newPullParser();
		List<Sms> smsList = null;
		Sms sms = null;
		try {
			pullParser.setInput(stream,"utf-8");
			int eventType = pullParser.getEventType();
			while (eventType != XmlPullParser.END_DOCUMENT) {
				switch (eventType) {
				case XmlPullParser.START_TAG:
					if("smss".equals(pullParser.getName())){
						smsList = new ArrayList<Sms>();
					}else if("sms".equals(pullParser.getName())){
						sms = new Sms();
						String id = pullParser.getAttributeValue(null, "id");
						sms.setId(id);
					}else if("address".equals(pullParser.getName())){
						sms.setAddress(pullParser.nextText());
					}else if("date".equals(pullParser.getName())){
						sms.setDate(pullParser.nextText());
					}else if("content".equals(pullParser.getName())){
						sms.setContent(pullParser.nextText());
					}
					break;
				case XmlPullParser.END_TAG:
					if("sms".equals(pullParser.getName())){
						smsList.add(sms);
					}
					break;
				default:
					break;
				}
				eventType = pullParser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return smsList;
	}
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liuhenghui5201/article/details/82822230

智能推荐

MFC实现的Socket通信_小晓晓儿的博客-程序员宅基地

我觉得MFC的东西挺难说的,好像代码没有一个头,也没有一个尾,不知道从何讲起。所以我只说说socket的部分,当然包括服务端和客户端。     这是服务端的样子:         大家先去 附件中 把代码下下来,否则看文章是看不懂的。服务端代码,打开类视图,找到ListenThreadFunc函数。这是我们的线程函数,socket代码在该线程里执行。view sou

浏览器调试app,添加token方式_虫子?的博客-程序员宅基地_浏览器添加token

1,获取app端对应应用的token2,输入地址,F12或者设置调整到开发者模式,选择application项--cookie,点击展开地址,在右侧对应的模块输入token和value,然后重新输入地址...

深入理解QT的SIGNAL\SLOT机制(二):QMetaObject相关知识_huliweiweiba的博客-程序员宅基地

在真正开始理解SIGNAL和SLOT之前需要先了解一下QMetaObject的相关知识,本章我们来了解QMetaObject。QT会为继承自QObject并且有QOBJECT宏的所有对象生成moc_**.cpp文件,也就是说,只要你想使用SIGNAL和SLOT就要继承自QOBject,并且包含QOBJECT宏。 5.9.1版本的moc文件只关心SIGNAL、SLOT函数,5.4的版本的moc文件会

极光推送iOS_网上的虫的博客-程序员宅基地

1.配置开发证书(得有开发者账号,个人,企业的都可以)    开发环境测试 在对 JPush iOS 开发环境进行测试前,请确保 3 个统一:App 是开发环境打包(开发证书 Development)上传了开发证书并验证通过Portal 上的应用设置为开发环境发布环境测试在对 JPush iOS 生产环境进行测试前,请

java etc profile_修改了/etc/profile文件后,不能进入系统_KJ(Kan Jia)的博客-程序员宅基地

问题是这样的,我需要设置系统的环境变量,在/etc/profile最后添加了exportexportJAVA_HOME=/usr/java/jdk-1_5_0_02exportCLASSPATH=.:$JAVA_HOME/lib.tools.jarexportPATH=$JAVA_HOME/bin:$PATH但是退出后再进入系统环境变量不生效,输入source/etc/profile起效果...

阿里云服务器以及CDN支持IPV6的方法_人类观察所主任的博客-程序员宅基地

自从AppStore要求必须支持IPv6后,国民感到震惊的同时,也加速了国内的ipv6的普及。 但是国内的服务器托管商(比如阿里云)几乎都不支持IPv6。 本文是博主金亚大王呕心沥血的填坑之旅,亲测可行,完美支持IPv6关键词: 阿里云,ECS, IPV6, CDN,IPV6隧道废话不多说,说说我是怎么解决的。思路: 数据交互层 建立IPv6隧道到服务器 静态CDN 需要使用国外的DNS来C

随便推点

人工智能AI中关于数据标注标签处理的工具集锦_钱多多先森的博客-程序员宅基地_人工智能标签

import osimport jsonimport numpy as npimport PIL.Imageimport PIL.ImageDrawimport base64from PIL import Imageimport ioimport cv2import matplotlib.pyplot as pltdef polygons_to_mask(img_shape, polygons): mask = np.zeros(img_shape, dtype=np.ui..

VBS 之CreateObject介绍..._weixin_34072159的博客-程序员宅基地

VBS 之CreateObject介绍ADO对象ConnectionCommandRecordSetRecordStreamServer.CreateObject("Scripting.FileSystemObject")Server.CreateObject("Scripting.Dictionary") HashTableServer.CreateXObject("Word....

半自动的行人重识别数据标注算法Tracking + infomap_songlixiangaibin的博客-程序员宅基地_行人重识别标注

Fast-ReID系列文章目录文章目录Fast-ReID系列文章目录前言一、行人截取二、行人聚类聚类优化前言本人做行人重识别工程的数据准备过程。借鉴人脸的数据聚类清洗方法实现半自动行人重识别数据标注。一、行人截取使用行人跟踪算法,讲视频中行人截取出来: 使用yolov5 + deepsort 实现行人跟踪参考此方法Yolov5_DeepSort GitHub,并稍作修改以过滤掉不完整和太小的行人1. 限制检测到行人的长宽比例和大小w = x2 - x1h = y2 - y1person

Linux面试指令---du指令_头脑灵活的胖子的博客-程序员宅基地

        Linux 中 du 命令也是查看使用空间的,但是与 df 命令不同的是 Linux du 命令是对文件和目录磁盘使用的空间的查看。du 命令是 disk usage 的缩写。(1)命令格式         du [选项] 文件(2)常用参数参数 描述 -a 显示目录中个别文件的大小。 -b 显示目录或文件大小时,以 byte 为单位。 ...

git conflict_xiaozhiwise的博客-程序员宅基地

&lt;&lt;&lt;&lt;&lt;&lt;&lt; ======= &gt;&gt;&gt;&gt;&gt;&gt;&gt; # 标记出不同分支的内容 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。...

mysql数据类型 区别_MySQL分钟数据类型的区别_weixin_39789370的博客-程序员宅基地

char、varchar、text、ntext、 bigint、int、smallint、tinyint和bit的区别及数据库的数据类型Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就...

推荐文章

热门文章

相关标签