• 在android读写文件
  1. RAM:运行内存,相当于电脑的内存
  2. ROM:内部存储空间,相当电脑硬盘,android手机必须有的
  3. 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();
}
}

  • 在外部存储读写文件
  1. 外部存储路径
    • 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每一个应用都是一个独立用户,可以设置用户组。

    • 第一个字母
    1. d:表示是文件夹
    2. -:表示是文件
    • 第一组rwx:文件拥有者(owner)的权限
    1. r:表示有读权限,-表示没有
    2. w:写权限
    3. 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
    1. 以键值对的形式保存数据
    2. 适合存放零散简单的数据
    3. 写文件

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 学习随笔二(读写文件)的更多相关文章

  1. android 学习随笔二十二(小结)

    ADB进程 * adb指令 * adb install xxx.apk * adb uninstall 包名 * adb devices * adb start-server * adb kill-s ...

  2. android 学习随笔二十一(内容提供者 )

    一.内容提供者* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的私有数据* 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查 ...

  3. android 学习随笔二十九(自定义监听 )

    package com.itheima.momo.dialog; import com.itheima.momo.R; import android.app.AlertDialog; import a ...

  4. android 学习随笔二十八(应用小知识点小结 )

    去掉标题栏的方法 第一种:也一般入门的时候经常使用的一种方法requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏注意这句一定要写在setConte ...

  5. android 学习随笔二十六(动画:属性动画)

    属性动画,属性动画是真正改变对象的某个属性的值 * 补间动画,只是一个动画效果,组件其实还在原来的位置上,xy没有改变1.位移:* 第一个参数target指定要显示动画的组件* 第二个参数proper ...

  6. android 学习随笔二十四(动画:帧动画)

    帧动画,一张张图片不断的切换,形成动画效果 * 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长 * FrameAnimatio ...

  7. android 学习随笔二十三(动画:Fragment )

    Fragment * 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 * 在一个Activity中切换多个界面,每个界面就是一个Fragment* Fragmnen ...

  8. android 学习随笔二十(多媒体编程 )

    1.图片处理 加载大图片 图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节* 16色图:每个像素占用1/2个字节* 256色图:每个像素占用1个 ...

  9. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

随机推荐

  1. Oracle本地网络分表模拟分区裁剪

    来自讨论贴 http://www.itpub.net/thread-1877111-1-1.html 准备数据表 2014-07-20 01:38:10>create table tb_1 as ...

  2. SQL Server 2008 Express 安装或卸载时提示“重启计算机失败"的解决办法

    安装或卸载SQL Server 遇到错误提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机.如下图: 解决办法: 1.在开始->运行中输入regedi ...

  3. oracle 常用视图和表

    1.查看当前用户的基本信息 select * from user_users 2.查看当前用户的角色 select * from user_role_privs 3.查看当前用户的系统权限和表权限 s ...

  4. javascript学习之位置获取

    一.获取浏览器的大小和位置 具体可以参见博客:http://www.cnblogs.com/bobodeboke/p/4653920.html 二.获取元素的大小和位置 方法一.利用offsetXXX ...

  5. ON_NOTIFY_REFLECT : Message Reflection for Windows Controls

    转自: https://msdn.microsoft.com/en-us/library/eeah46xd.aspx TN062: Message Reflection for Windows Con ...

  6. cocos2dx 3.x(点击屏幕移动精灵,拖动精灵)不需要写回调函数Lua表达式

    // // MainScene.cpp // helloworld // // Created by apple on 16/9/19. // // #include "MainScene. ...

  7. [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable

    1.首先看一个简单的例子 int[] myArray = { 1, 32, 43, 343 }; IEnumerator myie = myArray.GetEnumerator(); myie.Re ...

  8. Swift实战-豆瓣电台(七)显示动画

    youku观看地址http://v.youku.com/v_show/id_XNzMxODQzNDIw.html 这是一个很酷的动画效果.特别是数据多的时候 知识点 在单元格(Cell)显示方法中设置 ...

  9. 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 ...

  10. TImageList 和 TlistView 组件(C++Builder)

    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { //加载图标到Imagelist Graphics::TBitmap *bm ...