IO流的分类
- 一种是按照流的方向进行分类:输入(读)、输出(写)。
- 另一种方式是按照读取数据方式不同进行分类:
- 1、有的流是按照字节的方式读取数据,一次读取一个字节(byte),等同于一次读取8个二进制位。这种流是万能的,什么类型的文件都可以读取(包括:文本文件、图片文件、声音文件、视频文件等),这种称为字节流。
- 2、有的流是按照字符的方式读取数据,一次读取一个字符,这种事为了方便读取普通文本文件而存在的,改流不能读取图片、神医、视频等文件,只能读取纯文本,连word文件也无法读取(word文件含有格式)。
java IO流的四大家族:
-
java.io.InputStream(字节)
-
java.io.OutputStream(字节)
-
java.io.Reader(字符)
-
java.io.Writer(字符)
输入输出流用完后都需要close(),一般写在finally中。而输出流在close()前需要flush()刷新。这个刷新表示将通道/管道当中剩余为输出的数据强行输出完。(清空管道)
一般需要掌握的流有16个
- 文件专属流:
- FileInputStream
- FileOutputStream
- FileReader
- FileWriter
- 缓冲流:
- BufferedReader
- BufferedWriter
- BufferedInputStream
- BufferedOutputStream
- 转换流:
- InputStreamReader
- OutputStreamWriter
- 数据流:
- DataInputStream
- DataOutputStream
- 标准输出流:
- PrintWriter
- PrintStream
- 对象流:
- ObjectInputStream
- ObjectOutputStream
FileInputStream
使用普通方法:一次读取一个字节,内存和硬盘交互频繁,资源开销大。
可以采用byte数组一次读取多个字节,最多读取数组.length个字节。
改进while循环
这个可以配合available()方法使用,在没有读取前available()得到的是总字节数量,但该方法不太适合大文件,因为byte[]数组不能太大。
FileOutputStream
该字节输出流大题跟输入流流程一样,多了一个flush(),但有一点需要注意,输出流若不存在文件则会创建文件,如果存在则会清空文件再输出。如果想要不清空文件而是接着末尾输出,则需要在实例化输出流对象时加入关键字true。加入关键字true
文件的copy
文件的复制本质上是边读边写。
FileReader/Writer
文件字符流输入/输出,只能读取/输出普通文本文件。读取/输出文本内容时方便快捷。
使用字符流copy(复制普通文本文件)
BufferedReader/Writer
自带缓冲区的字符输入流,使用这个流时不需要自定义char、byte等数组,自带缓冲。
需要注意,readLine方法到结尾时返回为null,不再是-1。
这种字符流通常称为包装(处理)流,而在其中使用的FileReader称为节点流。
InputStreamReader/OutputStreamWriter
转换流,把字节流转换成字符流使用。
数据流
这个流可以将数据和数据类型一并写入文件,同时需要数据流才能读取该文件。读取数据时还需要知道数据写入顺序才能读取。
PrintStream
该流不需要关闭,而且可以设置输出方向,实现了日志的基础模型。
日志工具类的基础实现:
IO流和Propertise
通常用来做配置文件或本地化数据的使用,实现了数据驱动这个理念。