(今天又是元气满满的一天,公司大小周上班,不巧的是,今天是小周,so,我现在在办公室继续上班,不忙的时候,我给大家更新博客。)
Java 的 io 可以说是Java中的一个大石头,很少能有人搬起来,抬走。原因很简单,这个东西学不好就这样,一旦涉及到文件操作,就头大,我希望大家看完我的这几篇连载博客,能够有所感悟,废话不多说,开刚!
一、IO
我们先来认识一下IO,什么是IO
IO,这俩字母需要分看看,I(这是“爱”!不是数字1 也不是L !!!)代表的单词是input,翻译过来是输入,O(这是字母“欧”,不是数字0)代表的单词是Output,翻译过来是输出,这俩字母合起来就是输入输出。
知道了什么是IO,我就可以继续说Java了,Java中将IO抽象了一下,并且给定义了一个名字,流。
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出-------《百度百科-IO流》
大家详细请看百度百科,这个比较权威。
我自身的理解,流就类似一个通道,数据到了通道口,开始进行转换,转换成能进入通道口的样子,然后顺着通道进行流动,然后出来通道的时候,再进行反转换,转换回去。
二、输入流、输出流
有了流之后,还不行,我们还得划分,你给我,对于你来说是输出,对于我来说是输入。所以人们还给流定义了方向。
当然,上面说的只是一个比喻,我们实际上可以用计算机来说输入流输出流
输入流:输入流是相对程序而言的,外部传入数据给程序需要借助输入流。就像你从计算机硬盘上读取文件,相对于你来说,这是输入,因为你得到了文件
输出流:输出流是相对程序而言的,程序把数据传输到外部需要借助输出流。这就像你写了一个word,然后存到硬盘上。这就是输出。
要好好理解这里,有点绕,我给大家画个图,大家可能更明白。
好吧,我属实画不出来,所以从网上搂了一个图得了
三、字节流 字符流
说完流动方向之后,然后就是流动的内容了。
在说这个之前,我们先来说一下字节和字符这两个东西
字节:Byte
字符:Character
一个字节 等于 8bit(bit是存储信息的最小单位)
一个字符 等于 2个字节 等于 16个bit
这么看说明 一个字符 要比 一字节大 两倍,知道了这个我们继续看
Java将文件进行解析,拆分,按照拆分的情况,一个拆到字节就不往下拆分了,一个拆到字符就也不拆分了。
所以,Java还按照这两种拆分情况,将流划分成两种一个是字节流,一个是字符流。
以上都为你记忆字节流和字符流不同,我用另外的一个思想和你说的,但实际情况如下:
原本其实没有字符流,只有字节流,主要是用在处理二进制数据,而它处理是按照字节来进行处理的。
但是实际上来说,我们一般用到的数据都是文本,这才提出字符流的概念,这个是使用Unicode编码,字节流是采用的ASCll编码。
加粗的一定要记住!!!!
四、字节流和字符流的区别
区别1:他俩基本单位不一样,一个大一个小,看上面就知道
区别2:字节和字符 这俩流处理的对象不同,字符主要是处理文本,字节是啥都行。
区别3:(我们后面会讲)字符流按照字符进行读取数据,一次读取两个字节,返回了这两个字节所对应的int类型的值(其实这个值就是编码)。写入文件时把这两个字节的内容解码成这个字符在Unicode码下对应的二进制数据写入。也就是说,读取的时候,按照字符形式读取出来二进制数据,然后,再以二进制写入。咋进咋出。
字节流和字符流类似,但是人家是按照一个一个字节进行读取,咋读咋写。
扩展:你要是用字符流去读取图片,然后再用字符流去存,我和你说,要是能打开存好的图片,我吃屎!(原因:人家图片是按照字节去存储的,你用字符流形式先读再存,最后能看才有了鬼,读就读错了)
区别4:看图说话
图
好吧,没有图,我就用嘴说,字符流中用了缓冲,而字节流并没有使用缓冲,问题来了,用缓冲好呢,还是不用缓冲好呢?
答案在后几篇博客中,自己去翻着看吧。
五、IO流大家族
是的,你没有看错啊,很多。。。
我是一下子记不住那么多,我只记住一些常用的,不常用的需要现查
大家可以打开Overview (Java Platform SE 8 ) Java Api 开发文档,一边看一边熟悉,可以自己找个本子,纸张画一下继承啊啥的结构。
下一节内容,先来学习一下字节流!我们先学字节流,字符流排在字节流后面说