登录不老阁

 
注册成功

二呆

diamond@tongleer.com

岂能尽如人意,但求无愧我心。

【Android】学习札记第7章之IO流三及XML初步

2017-6-11 二呆 Android 542观看

上一节介绍了字节流的使用,这一节会继续深入介绍字符流的使用,会涉及到读写过程中的字符编码转换,和对象序列化。当我们正在玩android编写的游戏时,突然来了电话,这时就可能需要对象序列化来保存状态,当继续玩游戏时再恢复数据。

在网络上传输数据用的最多的语言就是XML了,它是结构化语言,语法严格,语义表达清楚,这一节就会初步了解XML的基本语法。

工具/原料

JDK、eclipse、android SDK、ADT

一、IO

1、PrintStream

①任何类型数据转成字符串输出

②创建对象

PrintStream p=new PrintStream(相接的流)

PrintStream p=new PrintStream(文件)

PrintStream p=new PrintStream(文件,字符集)

③方法

print(97):39 37

println(97):39 37 0D 0A->97\r\n

2、编码

⑴字符编码Encoding、字符集Charset

①单字节字符:

ASC-Ⅱ:0-127个字符(包含英文、标点字符)

西欧字符(ISO-8859-1或Latin-1):包含159-255个字符

注:(127,159)字符包含控制字符

②双字节字符:

国标GB2312:包含7K多个中文,不包含一些姓、不常见的字“喆、镕”,用字符“?”代替。

GBK:包含20902个中文

③Unicode:统一码、万国码,包含70万多个字符。

常用字符:双字节

生僻字符:三个或三个以上的字节

注:java的char类型属于Unicode编码。

Unicode传输格式:

UTF-8:对英文占1字节,对某些字符占2字节,对中文占3字节。

UTF-16Be:

UTF-16Le:每个字节与UTF-16Be相反

⑵编码转换

①Unicode->其他编码

String s="abc中文";

byte[] a=s.getBytes();//Unicode->操作系统默认编码(android:utf-8,window:gbk)

byte[] a=s.getBytes("UTF-8");//Unicode->UTF-8

②其他编码->Unicode

String s=new String(a);//操作系统默认编码->Unicode

String s=new String(a,"UTF-8");//UTF-8->Unicode

3、字符流:

①父类:java.io.Reader/Writer(抽象类)

②子类:java.io.InputStreamReader/OutputStreamWriter

Ⅰ、编码转换流(读取数据需要刷新或关闭流)

InputStreamReader:

读取其他编码的字符,转成Unicode字符。read

OutputStreamWriter:

将内存中Unicode字符,转成其他编码的字符。write

Ⅱ、创建对象

InputStreamReader ir=new InputStreamReader(相接的字节流);//默认字符集

OutputStreamReader ir=new OutputStreamReader(相接的字节流,字符集);//指定字符集

③方法:(和抽象类的方法相同)

Ⅰ、Writer:

write(int c):int末尾两个字节,是char字符的两个字节值,只输出末尾两个字节。

write(char[] buf):输出数组中全部的字节值。

write(char[] buf,int from,int to):输出数组中的从from开始的num个字节值。

write(String s):输出字符串

Ⅱ、Reader:

read():单字节读取

read(char[] buf):多字节读取

④java.io.FileReader/FileWriter

内部是“编码转换流”接“文件字节流”,提供一种“编码转换流”代码的简化方式而已。

缺点:不能指定编码。

实质:InputStreamReader/OutputStreamWriter和FileInputStream/FileOutputStream的结合体。

4、字符缓冲/高级流

Ⅰ、java.io.BufferedReader/BufferedWriter

①提供字符缓冲区:

②方法:

BufferedReader的readLine()方法:读取一行字符串,不包含末尾换行,读取结束后超出返回NULL值。

Ⅱ、java.io.PrintWriter

①与PrintStream作用、用法完全相同,不同点:PrintStream只能接字节流,PrintWriter既能接字节流又能接字符流。

②方法

print():输出字符串不进行换行。

println():输出字符串并换行。

Ⅲ、练习

文本文件的复制,并转换编码。

5、java.io.ObjectInputStream/ObjectOutputStream

Ⅰ、对象序列化、反序列化,保存对象的值、变量等数据

①不序列化输出的成员:

static:静态

transient:临时、瞬间、瞬态(只在程序运行期间保存,不会持久保存,不会被恢复)

②序列化头部数据:

新建ObjectOutputStream对象时,会先输出4个头部字节值。

新建ObjectInputStream对象时,会先读取4个头部字节值,来确认后面的数据是对象队列化数据。

③序列化版本

旧版本数据,不能恢复成新版本的类型。

Ⅱ、创建对象

ObjectOutputStream out=new ObjectOutputStream(相接的流);

Ⅲ、方法

ObjectOutputStream

writeObject(Object obj):序列化输出一个对象

ObjectInputStream

readObject():读取并恢复一个对象,反序列化。

6、java.io.ByteArrayInputStream/ByteArrayOutputStream

①与内存中一个数组相接,读写数组中的字节数据,效率非常高,属于低级流,直接跟数据相接,需要和对象序列化类一起使用。

②创建对象

ByteArrayInputStream bais=new ByteArrayInputStream(byte[]数组);

ByteArrayOutputStream bais=new ByteArrayOutputStream();

输出流内部自动维护一个数组,输出的数据,都放在这个数组当中;

输出结束后,可以通过调用toByteArray()来取出内部的字节数组。

③方法

ByteArrayOutputStream中的toByteArray()方法:取出内部维护的数组。

注:使用这个字节流进行对象序列化相比ObjectOutputStream/ObjectInputStream效率会非常高,因为会直接在内存中读写数据。

二、XML

1、概念:

①可扩展的标记语言,XML是结构化的数据,由程序解析数据。

②作用:存储数据和传输数据。

android学习札记第7章之IO流三及XML初步

2、语法:

①头标记:必须在文档的第一个字节

②根元素:最外层根元素只能有一个

③元素必须有结束标签

④元素必须正确嵌套

⑤属性必须有属性值

⑥属性的值必须有引号,双引号、单引号都可以。

⑦转义实体:

<:<</P>

>:>

":"

':'

&:&

⑧机器在提取内部内容时,所有字符作为普通字符提取出来,不会做任何运算处理。

原样输出内容

注意事项

运用输入输出流时要注意字符编码必须一致,否则会出现乱码。

对象序列化使用ByteArrayInputStream/ByteArrayOutputStream在内存中处理读写,效率会非常高。

输入流和输出流要熟练掌握,才能在后续项目中运用自如。

标签: Android Android开发入门 学习札记 AndroidIO XML

« 【Android】学习札记第8章之XML及处理XML解析和创建 | 【Android】学习札记第7章之IO流二»

  • 觉得很赞 (0)
  • 打赏
  • X
    打赏
    • 微信
    • QQ红包
    • 支付宝


    用微信扫一扫

    您的鼓励将是站长及作者前行的动力,谢谢打赏
    (若二维码有误可举报)

发表评论:

快乐贰呆的关注更多 >

小草窝博客

博主是一名天朝的学生,喜欢折腾各种奇怪的语言,喜欢探索未知的事情

标签

Genymotion Button HTML 腾讯视频 Win10 火腿肠意面 MIUI 主题编辑器 Android emlog pjax EventBus AndroidStudio 快捷键 倒计时 工具类 eclipse javascript 励志语录 自定义Dialog Demo java 热伤风 redis RabbitMQ ZeroMQ ActiveMQ Kafka Jafka php 鸡蛋饼 直播 继承 面向对象 工厂模式 AutoCompleteTextView GridView RadioButton ToggleButton Android开发入门 EditText CheckBoxes 控件 TimePicker AnalogClock DigitalClock ProgressBar SeekBar RatingBar UI控件 Spinner ScrollView Adapter 单元测试 Dialog 自定义对话框 Android项目 布局 Android视频 Java4Android Android开发教程 学习札记 基本数据类型 运算符和流程控制 流程控制循环语句 数组 数组二 二维数组 安卓基础 安卓监听器 表格布局 帧布局 网格布局 Android异常 AndroidIO XML XML解析 用户登录 数据存储 SQLite内部数据存储 Unity3D教程 Linux subversionSVN TortoiseSVN ViewPager Fragment 预加载 Android实战开发 唯一识别码 锁屏 Activity CheckBox ListView 增删改查 图片回收处理 内存溢出 仿2列商品列表 AndroidNDK eclipse插件 jni开发 jni调用 so文件 Androidmk配置 Flash 绘制图形 苹果 图标 变形工具 滤镜 Flash特效 简单薄餐 Flash滤镜 Flash动画 Android开发 天气预报 醋溜白菜 香菇烩豆腐 微波豆腐蒸蛋 速成凉拌豆腐 杜子建 穷根 男装搭配 黄帝内经 大蒜洋葱粥 情商密码 中华药粥 交际红人 小白菜萝卜粥 每日一笑 完美国际 故梦 一卷情长 Ukulele 白熊音乐 零基础 指弹 教程 白桦树娃娃 新加坡 网红美食 海南鸡饭

公众号

同乐儿