编码:字符串变成字节数组。数组
解码:字节数组变成字符串dom
String --> byte[]; str.getBytes();函数
byte --> String: new String(bytep[]);测试
若是编码的时候产生错误,就放弃编码
若是解码的时候产生错误,就编一次,解一次(通用方法)[对编码的时候用gbk,解码的线程
时候用utf-8,这种方法不行,由于utf-8会去找类似的字,结果源码就会变掉]指针
在记事本里输入联通两个字,就会变成乱码,由于这两个字符合联通的编码形式code
符合UTF-8的编码规则对象
没有方法的接口称之为标记接口继承
FileOutputStream out;
out.write(256) 只是输出最低8位
打开记事本实际上是解码的过程
objectInputStream与ObjectOutputStream
被操做的对象须要实现Serizlizable(标记接口); static final long serialVersionUID = 42L;
Serizlizable接口的标签
将堆内存中的对象转化为硬盘上的
因此静态的不能序列化(也称为持久化存储),,在方法区
加关键字transient 也不能序列化
管道流:
PipedInputStream 和PipedOutputStream
输入输出能够直接进行链接,经过结合线程使用
RandomAccessFile
随机访问文件,自身具有读写的方法。
经过skipBytes(int x),seek (int x) 来达到随机访问
该类不是IO体系中的子类。
而是直接继承来自Object
可是它是IO包中成员,由于它具有读和写功能。
内部封装了一个数组,并且经过指针对数组元素进行操做
能够经过getFilePointer获取指针信息
同时能够经过seek改变指针的位置
其实文成读写的原理就是内部封装了字节输入流和输出流
经过构造函数能够看出,该类只能操做文件
若是模式为只读r,不会建立文件,会去读取一个已存在文件,若是该文件不存在
则会出现异常。
若是模式为rw,操做的文件不存在会自动建立,存在会建立,存在则不会覆盖
经过seek方法,调整对象中指针,a.write(int) 输出的是参数的最低8位,
能够用于操做基本数据类型的流对象
DataInputStream与DataOutputStream 若是以writeUTF只能以对应的方法来读取。不能用转换流,writeUTF用的UTF-8修改版
若是是字节流,存入到记事本里,系统会选择编码表来查,因此都是乱码。
操做基本数据类型
DataInputStream与DataOutputStream
操做字节数组
ByteArrayInpuStream 与
ByteArrayOutputStream
操做字符数组
CharArrayReader与CharArrayWrite
操做字符串
StringReader与StringWriter
ByteArrayInputStream: 在构造的时候,须要接收数据源,并且数据源是一个字节数组
ByteArrayOutputStream: 在构造的时候,不用定义数据目的,由于该对象中已经内部封装了可变长度的本身数组,这就是数据目的地。
由于这两个流对象都操做数组,并无使用系统资源,因此,不用进行close关闭。
源设备:
键盘 System.in 硬盘 FileStream 内存 ArrayStream
目的设备:
控制台 System.out 硬盘 FileStream 内存 ArrayStream
用流的思想来操做数组
计算机只能识别二进制数据,早起又来是电信号
为了方便应用计算机,让它能够识别各个国家的文字,就将各个国家的文字用数字来表示
并一一对应,造成一张表
这就是编码表
ASCII: 美国标准信息交换码 用一个字节的7位可表示
ISO8859-1 : 拉丁码表,欧洲码表, 用一个字节的8位表示
GB2312: 中国的中文码表
GBK: 中国的中文编码表升级,融合了更多的中文文字字符号
Unicode: 国标标准码,融合了多种文字;
UTF-8: 最多用三个字节来表示一个字符
中间其实走过Unicode ,用你好来测试