天天看点

java之IO概述及字节流

1.IO的引入

java之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

此时,输出的就是我们想要的啦。

java之IO概述及字节流

那么现在看懂下面的代码吗?

8.字节缓冲流

  字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多哦,这是加入数组这样的缓冲效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰模式),所以提供了字节缓冲区流

字节缓冲输出流

BufferedOutputStream

字节缓冲输入流

BufferedInputStream