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位,所以并不会得到你想要的数据。