目录
在Java程序中,对于数据的输入/输出操作以“流”(Stream)方式进行;J2SDK提供了各种各样的“流”类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据。
读入写出
Java.io 包中定义了多个流类型(类或抽象类)来实现输入/输出功能;可以从不同的角度对其进行分类:
两个概念:
输入流:InputStream(字节流),Reader(字符流)
输出流:OutPutStream(字节流),Writer(字符流)
区分什么叫输入流?什么叫输出流?
如果站在文件的角度上,这叫输出。
如果站在程序的角度上,这叫输入。
我们以后说输入流和输出流都是站在程序的角度上来说。
1.节点流类型
节点流就是一根管道直接插到数据源上面,直接读数据源里面的数据,或者是直接往数据源里面写入数据。典型的节点流是文件流:
文件的字节输入流(FileInputStream),文件的字节输出流(FileOutputStream),文件的字符输入流(FileReader),文件的字符输出流(FileWriter)。
2.处理流类型
处理流是包在别的流上面的流,相当于是包到别的管道上面的管道。
继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。
read()方法是一个字节一个字节地往外读,每读取一个字节,就处理一个字节。read(byte[] buffer)方法读取数据时,先把读取到的数据填满这个byte[]类型的数组buffer(buffer是内存里面的一块缓冲区),然
后再处理数组里面的数据。
使用FileInputStream流来读取FileInputStream.java文件的内容
继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(8bit):下图中深色的为节点流,浅色为处理流。
Reader : 和InputStream一模一样,唯一的区别就在于读的数据单位不同继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)
16位:一个字符也就是两个字节,使用Reader流读取数据时都是两个字节两个字节往外读的,为什么还要有这两种两个字节的读取方式呢? 因为有些字符是占2个字节的,如我们的中文字符在Java里面就是占两个字节的。如果采用一个字节一个字节往外读的方式,那么读出来的就是半个汉字,这样子Java就没有办法正确的显示中文字符的,所以有必要存在这种流,一个字符一个字符地往外读。
继承自Writer的流都是用于程序中输出数据,且数据的单位为字符(16bit)
FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的。
所以读取和写入占用2个字节的字符时都可以正常地显示出来,所谓的节点流指定就是直接把输入流或输出插入到数据源上,直接往数据源里面写入数据或读取数据。
部分图片来源:百度图片
原文:https://www.cnblogs.com/koudada/p/14775596.html