IO流:编码方式,字节字符区别以及一些流的父类的区别以及使用情况。

OK 我承认记性不好,IO流心里真的是有印象,但是却总是一些概念模模糊糊记不住。所以最近我想把知识点复习一哈,查缺补漏,之后为下一阶段进军。

此篇文章为IO流相关知识总结。包括编码方式,字节字符区别以及一些流的父类的区别以及使用情况。

想用markdown来写的,但是最近不知道是我浏览器的问题还是csdn的问题,总是页面显示有bug。。


(一)首先,bit/字节/字符明确一哈。

1)比特(bit)是最小的二进制单位。1bit在磁盘中以二进制0或1的形式保存。

2)字节(byte)是计算机操作数据的最小单位。比如说流操作的时候就是以byte为单位来操作的。

取值范围为-128至127。1个字节等于8位 1byte=8bit 。

3)字符(char)是用户可读写的最小单位。根据不同的编码方式所占的字节也不一定。取值范围为0-65535。

一般来说一个字符(char)占两个字节(byte)也就是占16位比特(bit)。 


(二)其次,各编码方式所占字节数明确一哈。

这个我是真的有点懵。。

找了一篇文章参考引用。

http://blog.sina.com.cn/s/blog_6ce2999701016fjp.html

经过上面网址的大佬的验证,结果如下。

英文字母:A
字节数:1;编码:GB2312
字节数:1;编码:GBK
字节数:1;编码:GB18030
字节数:1;编码:ISO-8859-1
字节数:1;编码:UTF-8
字节数:4;编码:UTF-16
字节数:2;编码:UTF-16BE
字节数:2;编码:UTF-16LE

中文汉字:人
字节数:2;编码:GB2312
字节数:2;编码:GBK
字节数:2;编码:GB18030
字节数:1;编码:ISO-8859-1
字节数:3;编码:UTF-8
字节数:4;编码:UTF-16
字节数:2;编码:UTF-16BE
字节数:2;编码:UTF-16LE


(三)IO流按照不同的类型分类

IO 流按照三种分类方式分类
1)按流的方向分为:输入流和输出流     
2)按流的传输(数据)单位不同分为:字节流和字符流     
3)按流的功能不同分为:节点流和处理流
 
 
 
(四)字节流/字符流最基本的父类
字节流:InputStream/OutputStream
字符流:Reader/Writer
ps:我发现字节流都是以Stream结尾的,字符流都是以Reader/Writer结尾的
 
 
 
(五)字节流和字符流之间的转换桥梁(InputStreamReader/OutputStreamWriter)
1)InputStreamReader:字节到字符的桥梁
2)OutputStreamWriter:字符到字节的桥梁
ps:这两个流对象有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。
用法eg:InputStreamReader isr = new InputStreamReader(new FileInputStream("fileName"));//
fileName为文件路径

(六)数据流(DataInputStream/DataOutputStream)啥时候用?怎么用?

把包括基本类型在内的数据和字符串按顺序输出到数据源,或者按照顺序从数据源读入,一般用

DataInputStream/DataOutputStream这两个流对象
用法eg:DataOutputStream dos = new DataOutputStream(new FileOutputStream(fileName));//fileName为文件路径


(七)缓冲流BufferedInputStream/BufferedOutputStream啥时候用?怎么用?

如果我要对字节流进行大量的从硬盘读取,需要使用BufferedInputStream/BufferedOutputStream这两个流对象。

原因: 使用缓冲流(BufferedInputStream/BufferedOutputStream)能够减少对硬盘的损伤

用法eg:BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));//fileName为文件路径


(八)缓冲流(BufferedReader/BufferedWriter啥时候用?怎么用?

BufferedReader是处理流中的缓冲流,可以将读取的内容存在内存里面,有readLine()方法;

BufferedWriter也处理流中的缓冲流,不常用,常常用PrintWriter代替。因为BufferedWriter没有println()方法,而PrintWriter有println()方法。BufferedWriter如果在使用时想换行,需要用到newLine()方法,进行换行操作。

用法eg:BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("fileName")));//fileName为文件路径


(九)节点流/处理流是什么?怎么用?

节点流 直接与数据源相连,用于输入或者输出 举例:OutputStream,FileInputStream
处理流:在节点流的基础上对之进行加工,进行一些功能的扩展 举例:OutputStreamWriter,InputStreamReader 
处理流的构造器必须要 传入节点流的子类

用法eg:InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName)));//fileName为文件路径


(十)文件流(FileInputStream/FileOutputStream)啥时候用?怎么用?

FileInputStream具体实现了在文件上读取数据
FileOutputStream 实现了向文件中写出byte数据的方法

用法eg:FileInputStream in = new FileInputStream(fileName);//fileName为文件路径


(十一)文件流(FileReader/FileWriter啥时候用?怎么用?

首先,FileReader和FileWriter是不能设置编码方式的,

如果遇到编码问题的时候,就需要使用基础的InputStream来操作了。

用法eg:FileReader fr = new FileReader("fileName");//fileName为文件路径


(十二)对象流(ObjectInputStream/ObjectOutputStream啥时候用?怎么用?
把一个对象写入数据源或者从一个数据源读出来,用ObjectInputStream/ObjectOutputStream这两个对象

用法eg:ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));//fileName为文件路径


(十三)什么是对象序列化反序列化?怎么做可以实现序列化

对象序列化:将对象以二进制的形式保存在硬盘上
反序列化:将二进制的文件转化为对象读取
实现serializable接口,如果某个字段不需要序列化或者特别的序列化在定义其时加transient关键字

注意:一个类要序列化,就要实现Serializable接口,反过来说,不实现Serializable就不能序列化
当父类没有实现Serializable接口,子类继承父类并实现Serializable接口,子类序列化时,父类的部分是没有被序列化的,那么反序列化的时候就没办法找到父类的部分,如果需要找到的话,就调用父类构造器初始化父类部分




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值