io流

1.流:流是一个抽象的概念,可以借助水流来理解,水流传输的是水,具有方向性,流传输的是二进制数据,同样也具有方向性,所以有输入流和输出流。二进制是因为现在的计算机都是依托于冯.诺依曼架构的。

2.流的分类:

(1)数据的流向:分为输入流和输出流

                            输入流:把数据从其他设备读取到程序中的流。

                            输出流:把数据从程序中写出到其他设备上的流。

(2)数据的类型:分为字节流和字符流

                            字节流:以字节为单位(byte),读写数据的流。

                            字符流:以字符为单位(char),读写数据的流。

 

 

 3.流的结构:和io相关的流,都派生自四个抽象的父类型:

     >InputStream   所有字节输入流的抽象父类型

     >OutputStream    所有字节输出流的抽象父类型

     >Reader     所有字符输入流的抽象父类型

     >Writer    所有字符输出流的父类型

有Stream则代表的是字节流,其他的是字符流。

 

 

 一般情况下:流会具备起码的三个特点:

-是输入还是输出

-是字节流还是字符流

-流向的目的地

实现类:

ByteArrayInputStream:以字节的形式从byte数组中读取数据

FileInputStream:以字节的形式从文件中读取数据

FileOutputStream:以字节的形式 将数据写出到文件中

......

字节输入流中大体上都会有重载的三个read方法

   1.read()每次读取一个字节,返回值是本次读取的字节值

   2.read(byte[ ] b)每次读取多个字节(最多读取b.length个字节),并存放到指定的字节数组b中,返回值是本次一共读取了多少个字节

   3.read(byte[ ] b,int off,int len)每次读取多个字节,并存放到指定的字节数组b中,返回值是本次一共读取了多少个字节,同时可以指定从数组的什么位置开始存放,以及一次要存放的数量。

同理字节输出流也有三个重载的write方法。

注意事项:在使用完流后一定要记得关闭流(输入流输出流),输出流要记得在输出后先刷新再关闭。

       关流操作:逐层关流,先关最外层的。

在管道流中,输入要与输出进行关联,关联后输出流把数据写到管道里,输入流从管道里读取数据。

在数据的输入输出中,一般来说,读取时使用无参的read方法,一个字节一个字节或者一个字符一个字符的读,终止条件为返回值=-1,写出是一般用三参的write方法  (个人建议)。

节点流 (转换流属于处理流)处理流

节点流:可以【直接】读取某一个地方的数据,或者【直接】把数据写入到某一个地方。

处理流:没有直接操作文件的功能,他可以包装节点流,让节点流去操作文件内容。

转换流:将字节流转换成字符流,Java中没有将字符流转换成字节流的。

例如:抽象父类:InputStream 。实现类FileInputStream 转换流 InputStreamReader。转换后的字符流:FileReader

       常用的节点流 :

父  类  InputStream OutputStream Reader Writer 

文  件  FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流 

数  组  ByteArrayInputStream  ByteArrayOutputStream  CharArrayReader  CharArrayWriter 

管  道  PipedInputStream  PipedOutputStream  PipedReader  PipedWriter 对管道进行处理的节点流 

      常用处理流(关闭处理流使用关闭里面的节点流): 

父 类  InputStream OutputStream Reader Writer 

缓冲流  BufferedImputStrean BufferedOutputStream BufferedReader BufferedWriter ----需要父类作为参数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以就写数据的时候需要使用flush方法。缓存功能其实就是先将数据放入一个数组中,然后一次性的把该数组输出到目的地,提高了效率,若不用缓存功能,则是将字节或者字符读一个放一个,这样效率比较低。 注意:因为BufferedWriter功能较少,所以一般都用printWriter,该实现类中有一个两个参数的重载方法,第二个参数可以选择是否自动刷新,详情参照API。

转换流  InputStreamReader  OutputStreamWriter-  要inputStream 或OutputStream作为参数,实现从字节流到字符流的转换 。

数据流  DataInputStream DataOutputStream -提供将基础数据类型写入到文件中,或者读取出来,为什么要有这个流呢?看这样的分析,如果没有这种流的话,有一个long,本身只占8个字节,如果我要写入到文件,需要转成字符串,然后在转成字符数组,那空间会占用很多,但是有了这种流之后就很方便了,直接将这8个字节写到文件就完了。是不是既节约了内存空间有让程序写起来更加方便简单了。写倒是很简单,但是读取的时候就注意了,读取的时候最好必须保证和写入的数据类型相符,否则可能会出现乱码的现象,比如你写入的是一个long类型的数,而读的时候却读的是int类型的,int类型4个字节32位,long类型8个字节64位,当你读的时候就只会读到高32位,所以并不会得到你想要的数据。

 

posted @ 2020-09-02 19:24  jamers  阅读(207)  评论(1编辑  收藏  举报