1.IO的引入

2.IO流的分类
流向:
输入流 读取数据
输出流 写出数据
数据类型:
字节流
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
我们一般在探讨IO流的时候,如果没有明确说明按照那种分类来说,默认情况下是按照数据类型来分的。
3.写入数据
4.实现数据的追加写入
5.加入异常处理的字节输出流操作
6.读取数据
改进版
7.复制文件
不过这种方式每次都是读取一个字节,效率太慢了,如果读取大的文件,这种方式就不适合。
看到这里很多人都崩溃了,为什么这么写呢?哈哈,且听老夫来分解代码?
如果我a.txt文件中的内容是
hello
world
java
那么我们按照下面的代码来执行
结果是这样的
hello5
--------------
wor5
ld
j5
ava
j3
why?
其实a.txt的内容是下面这样的啊
hello\r\n
world\r\n
java\r
我们是不是定义byte[] b = new byte[5];
第一次
hello 长度是5
第二次
\r\nwor 长度也是5
其实第二次相当于
b[0]=\r
b[1]=\n
b[2]=w
b[3]=o
b[4]=r
当然这些字符的底层会转换为byte的,不用担心啊,我这样写只是为了让各位理解
第三次
ld\r\nj 长度也是5
b[0]=l
b[1]=d
b[2]=\r
b[3]=\n
b[4]=j
第四次
ava\rj 长度也是5 是不是不理解啦
第三次的是不是这样的
但是这次其实只有ava,那么数组中是不是这样排列?
b[0]=a
b[1]=v
b[2]=a
那么第4,第5个元素呢,当然是第三次的,因为这一次是没有字符去赋值的。
懂了没?
但是我们如何避免这种情况呢?
看上面的len,就是每次读取的字节长度。5,5,5,3
那么,我们的代码改成下面的样子,是不是可以避免上面的问题呢?
ava3
此时,输出的就是我们想要的啦。
那么现在看懂下面的代码吗?
8.字节缓冲流
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多哦,这是加入数组这样的缓冲效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰模式),所以提供了字节缓冲区流
字节缓冲输出流
BufferedOutputStream
字节缓冲输入流
BufferedInputStream