android 学习随笔二(读写文件)
- 在android读写文件
- RAM:运行内存,相当于电脑的内存
- ROM:内部存储空间,相当电脑硬盘,android手机必须有的
- SD卡:外部存储空间,相当电脑的移动硬盘,不是必须的。手机如果内置16G存储空间,是内部空间和外部空间共用一个设备,如果还支持SD卡,新增的空间将作为外部存储空间的一个子文件夹(在外部空间建立一个快捷方式指向新增的SD卡,用程序访问外部空间访问不到新增的空间)。所以说现在手机自带的空间属于外部存储,然后手机基本内部外部共享一个存储设备
- 在内部存储读写文件
所有安装至手机的应用都会在data/data目录下生成一个包名文件夹,这个文件夹就是内部存储路径。
应用只能在自己的包文件夹下写文件
写文件
if(cb.isChecked()){
//File file = new File("data/data/com.ecollab.rwinrom/info.txt");
//返回一个FILE对象,封装的路径是data/data/com.ecollab.rwinrom/files,永久存储
//File file= new File(getFilesDir(),"info.txt");
//返回一个FILE对象,封装的路径是data/data/com.ecollab.rwinrom/cache,如果内部存储空间不足,cache的文件会被自动删除
File file= new File(getCacheDir(),"info.txt");
try {
FileOutputStream fos= new FileOutputStream(file);
fos.write((name + "&&" + pass).getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//System.out.println("登录成功");
Toast t= Toast.makeText(this, "数据存储成功", 0);
t.show();
读文件
//读取文件,回写数据
//File file = new File("data/data/com.ecollab.rwinrom/info.txt");
//返回一个FILE对象,封装的路径是data/data/com.ecollab.rwinrom/files,永久存储
//File file= new File(getFilesDir(),"info.txt");
//返回一个FILE对象,封装的路径是data/data/com.ecollab.rwinrom/cache,如果内部存储空间不足,cache的文件会被自动删除
File file= new File(getCacheDir(),"info.txt");
if(file.exists())
{
try {
FileInputStream fis = new FileInputStream(file);
//把子节流转换为字符流
BufferedReader br= new BufferedReader(new InputStreamReader(fis));
//读取文件中文本
String text= br.readLine();
String s[] = text.split("&&");
EditText et_name=(EditText) findViewById(R.id.et_name);
EditText et_pass=(EditText) findViewById(R.id.et_pass);
et_name.setText(s[0]);
et_pass.setText(s[1]);
Toast.makeText(this, "数据读取成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
- 在外部存储读写文件
- 外部存储路径
- 2.2~4.2:mnt/sdcard
- 4.3开始:storage/sdcard
- 2.2之前在根目录的sdcard
2. 权限
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.READ_EXTERNAL_STORAGE
3. 写文件
if(cb.isChecked()){
//MEDIA_REMOVED: sd卡不存在
//MEDIA_UNMOUNTED:sd存在,但是没有挂载
//MEDIA_CHECKING:sd卡正在遍历
//MEDIA_MOUNTED:sd卡可用
//MEDIA_MOUNTED_READ_ONLY:sd卡可用,但是只读
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//File file = new File("cdsard/info.txt");
//返回一个FILE对象,封装了外部存储的真实路径
File file = new File(Environment.getExternalStorageDirectory(),"info.txt");
try {
FileOutputStream fos= new FileOutputStream(file);
fos.write((name + "&&" + pass).getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//System.out.println("登录成功");
Toast t= Toast.makeText(this, "数据存储成功", 0);
t.show();
}
else {
Toast.makeText(this, "sd卡不可用哦", 0).show();
}
}
4. 读文件
//读取文件,回写数据
//File file = new File("cdsard/info.txt");
//返回一个FILE对象,封装了外部存储的真实路径
File file = new File(Environment.getExternalStorageDirectory(),"info.txt");
if(file.exists())
{
try {
FileInputStream fis = new FileInputStream(file);
//把子节流转换为字符流
BufferedReader br= new BufferedReader(new InputStreamReader(fis));
//读取文件中文本
String text= br.readLine();
String s[] = text.split("&&");
EditText et_name=(EditText) findViewById(R.id.et_name);
EditText et_pass=(EditText) findViewById(R.id.et_pass);
et_name.setText(s[0]);
et_pass.setText(s[1]);
Toast.makeText(this, "数据读取成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
5. preference 已经淘汰,但在android系统源码中还在,所以读系统源码会用到。有KEY、大标题、小摘要....
6. 获取SD卡空间
每个存储设备会被分为若干个区块
每个区块的大小 * 区块总数 = 存储设备的总大小
每个区块的大小 * 可用区块总数 = 存储设备的可用总大小
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize ;
long totalBlocks;
long availableBlocks;
//判断当前版本是否4.3或以上
if(Build.VERSION.SDK_INT>=18){//或者用 Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN_MR2
blockSize = stat.getBlockSizeLong();
totalBlocks = stat.getBlockCountLong();
availableBlocks = stat.getAvailableBlocksLong();
}
else {
blockSize = stat.getBlockSize();
totalBlocks = stat.getBlockCount();
availableBlocks = stat.getAvailableBlocks();
}
String text = formatSize(availableBlocks * blockSize);
TextView tv=(TextView) findViewById(R.id.tv);
tv.setText(text);
- 文件的访问权限(Permissions)
drwxrwxrwx
android每一个应用都是一个独立用户,可以设置用户组。
- 第一个字母
- d:表示是文件夹
- -:表示是文件
- 第一组rwx:文件拥有者(owner)的权限
- r:表示有读权限,-表示没有
- w:写权限
- x:执行execute
- 第二组rwx:与文件拥有者同一组的用户(grouper)
- 第三组rwx:其他用户(other)的权限(不用应用之间)
- 全局文件
//默认路径为data/data/包名/files
FileOutputStream fos=openFileOutput("info1.txt", MODE_PRIVATE);//MODE_PRIVATE,MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE
fos.write("XXXXXXX".getBytes());
- SharedPreference
- 以键值对的形式保存数据
- 适合存放零散简单的数据
- 写文件
SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE);
//获取编辑器
Editor ed= sp.edit();
ed.putString("name", name);
ed.putString("pass", pass);
//提交,生成XML文件保存
ed.commit();
4. 读文件
SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE);
String name=sp.getString("name", "");
String pass=sp.getString("pass", "");
EditText et_name=(EditText) findViewById(R.id.et_name);
EditText et_pass=(EditText) findViewById(R.id.et_pass);
et_name.setText(name);
et_pass.setText(pass);
- 写XML文件
public class Sms {
private String body;
private long date;
private int type;
private String address;
public Sms(String body, long date, int type, String address) {
super();
this.body = body;
this.date = date;
this.type = type;
this.address = address;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public long getDate() {
return date;
}
public void setDate(long date) {
this.date = date;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
-----------------------------------------------------------------------------
public class MainActivity extends Activity {
List<com.ecollab.createxml.domain.Sms> smslist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
smslist = new ArrayList<com.ecollab.createxml.domain.Sms>();
//虚构10条短信
for(int i=0;i<10;i++){
com.ecollab.createxml.domain.Sms sms = new com.ecollab.createxml.domain.Sms("nihao" + i, System.currentTimeMillis(), 1, "138438");
smslist.add(sms);
}
}
public void click(View v){
StringBuffer sb= new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
sb.append("<smss>");
for(com.ecollab.createxml.domain.Sms sms :smslist){
sb.append("<sms>");
sb.append("<body>");
sb.append(sms.getBody());
sb.append("</body>");
sb.append("<date>");
sb.append(sms.getDate());
sb.append("</date>");
sb.append("<type>");
sb.append(sms.getType());
sb.append("</type>");
sb.append("<address>");
sb.append(sms.getAddress());
sb.append("</address>");
sb.append("</sms>");
}
sb.append("</smss>");
File file = new File(Environment.getExternalStorageDirectory(),"sms.xml");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(sb.toString().getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
}
--------------------------------------------
- 序列化XML文件
//获取XML序列化器
XmlSerializer xs = Xml.newSerializer();
File file = new File(Environment.getExternalStorageDirectory(),"sms2.xml");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
//初始化,XML文件用什么编码生成
xs.setOutput(fos, "utf-8");
//生成头节点,头节点属性的值"utf-8",是否独立?不独立要其他文件支持
xs.startDocument("utf-8",true);
//生成开始标签
xs.startTag("", "smss");
for(com.ecollab.createxml.domain.Sms sms :smslist){
xs.startTag("", "sms");
xs.startTag("", "body");
xs.text(sms.getBody());
xs.endTag("", "body");
xs.startTag("", "date");
xs.text(sms.getDate() + "");
xs.endTag("", "date");
xs.startTag("", "type");
xs.text(sms.getType() + "");
xs.endTag("", "type");
xs.startTag("", "address");
xs.text(sms.getAddress());
xs.endTag("", "address");
xs.endTag("", "sms");
}
//生成结束标签
xs.endTag("", "smss");
//序列化生成结束
xs.endDocument();
} catch (Exception e) {
e.printStackTrace();
}
- XML文件解析(案例:天气预报XML)
public class City {
private String name;
private String temp;
private String pm25;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getPm25() {
return pm25;
}
public void setPm25(String pm25) {
this.pm25 = pm25;
}
@Override
public String toString() {
return "City [name=" + name + ", temp=" + temp + ", pm25=" + pm25 + "]";
}
}
---------------------------------------------------------------------------------------------------
List<City> cityList;
public void click(View v){
//获取天气信息XML文件,获取SRC下的资源
InputStream is=getClassLoader().getResourceAsStream("weather.xml");
//获取xmlpull解析器
XmlPullParser xp= Xml.newPullParser();
//初始化
try {
xp.setInput(is, "utf-8");//gbk
//获取当前节点事件类型,START_DOCUMENT=0,END_DOCUMENT=1,START_TAG=2, END_TAG=3, TEXT=4, etc
int type = xp.getEventType();
City city = null;
while(type != XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
if("weather".equals(xp.getName()))
{
cityList = new ArrayList<City>();
}
else if("city".equals(xp.getName())){
city = new City();
}
else if("name".equals(xp.getName())){
//获取下一个节点的文本,如:<name>西安</name>,返回西安文本
String name = xp.nextText();
city.setName(name);
}
else if("temp".equals(xp.getName())){
String temp = xp.nextText();
city.setTemp(temp);
}
else if("pm25".equals(xp.getName())){
String pm25 = xp.nextText();
city.setPm25(pm25);
}
break;
case XmlPullParser.END_TAG:
if("city".equals(xp.getName())){
cityList.add(city);
}
break;
default:
break;
}
//把指针移动到下一节点,并返回该节点的事件类型
type = xp.next();
}
} catch (Exception e) {
e.printStackTrace();
}
for(City city:cityList){
Toast.makeText(this, city.toString(), 0);
}
}
android 学习随笔二(读写文件)的更多相关文章
- android 学习随笔二十二(小结)
ADB进程 * adb指令 * adb install xxx.apk * adb uninstall 包名 * adb devices * adb start-server * adb kill-s ...
- android 学习随笔二十一(内容提供者 )
一.内容提供者* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的私有数据* 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查 ...
- android 学习随笔二十九(自定义监听 )
package com.itheima.momo.dialog; import com.itheima.momo.R; import android.app.AlertDialog; import a ...
- android 学习随笔二十八(应用小知识点小结 )
去掉标题栏的方法 第一种:也一般入门的时候经常使用的一种方法requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏注意这句一定要写在setConte ...
- android 学习随笔二十六(动画:属性动画)
属性动画,属性动画是真正改变对象的某个属性的值 * 补间动画,只是一个动画效果,组件其实还在原来的位置上,xy没有改变1.位移:* 第一个参数target指定要显示动画的组件* 第二个参数proper ...
- android 学习随笔二十四(动画:帧动画)
帧动画,一张张图片不断的切换,形成动画效果 * 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长 * FrameAnimatio ...
- android 学习随笔二十三(动画:Fragment )
Fragment * 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 * 在一个Activity中切换多个界面,每个界面就是一个Fragment* Fragmnen ...
- android 学习随笔二十(多媒体编程 )
1.图片处理 加载大图片 图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节* 16色图:每个像素占用1/2个字节* 256色图:每个像素占用1个 ...
- android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...
随机推荐
- Oracle本地网络分表模拟分区裁剪
来自讨论贴 http://www.itpub.net/thread-1877111-1-1.html 准备数据表 2014-07-20 01:38:10>create table tb_1 as ...
- SQL Server 2008 Express 安装或卸载时提示“重启计算机失败"的解决办法
安装或卸载SQL Server 遇到错误提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机.如下图: 解决办法: 1.在开始->运行中输入regedi ...
- oracle 常用视图和表
1.查看当前用户的基本信息 select * from user_users 2.查看当前用户的角色 select * from user_role_privs 3.查看当前用户的系统权限和表权限 s ...
- javascript学习之位置获取
一.获取浏览器的大小和位置 具体可以参见博客:http://www.cnblogs.com/bobodeboke/p/4653920.html 二.获取元素的大小和位置 方法一.利用offsetXXX ...
- ON_NOTIFY_REFLECT : Message Reflection for Windows Controls
转自: https://msdn.microsoft.com/en-us/library/eeah46xd.aspx TN062: Message Reflection for Windows Con ...
- cocos2dx 3.x(点击屏幕移动精灵,拖动精灵)不需要写回调函数Lua表达式
// // MainScene.cpp // helloworld // // Created by apple on 16/9/19. // // #include "MainScene. ...
- [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable
1.首先看一个简单的例子 int[] myArray = { 1, 32, 43, 343 }; IEnumerator myie = myArray.GetEnumerator(); myie.Re ...
- Swift实战-豆瓣电台(七)显示动画
youku观看地址http://v.youku.com/v_show/id_XNzMxODQzNDIw.html 这是一个很酷的动画效果.特别是数据多的时候 知识点 在单元格(Cell)显示方法中设置 ...
- How about xlogs are missing and xlogs are deleted
[postgres@minion1 bin]$ pwd /usr/local/pgtest/bin [postgres@minion1 bin]$ ./pg_ctl -D ../data/ start ...
- TImageList 和 TlistView 组件(C++Builder)
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { //加载图标到Imagelist Graphics::TBitmap *bm ...