1、流的分类
按照流的流向分:输入流和输出流
按照操作单元分:字符流和字节流
按照流的角色分:节点流和处理流
此次主要按照操作单元划分,结合具体的应用场景,分别对字符流和字节流进行描述。
2、字节流
Java中字节流处理的基本单位是单个字节,它通常用来处理二进制数据。字节流中最基本的两个类是InputStream和OutputStream,代表了最基本的输入字节流和输出字节流。
详细说明上图中的类:
2.1 InputStream
InputStream 是所有字节输入流的抽象基类。
2.1.2 FileInputStream
文件字节输入流,用于对文件数据以字节的形式进行读取操作。(字节流在默认情况下不支持缓存,在操作时本身不会用到缓冲区(内存),是文件本身直接进行操作,这意味着每次调用一次read方法就会请求操作系统来读取一个字节,往往会伴随一次磁盘I/O,效率比较低。)
FileInputStream常用方法:
1、read()
从输入流中读取一个字节返回int类型变量,若达到文件末尾,则返回-1。
public int read() throws IOException
运行一次只读取一个字节,所有经常与while((len=fileinputstream.read())!=-1)
一起使用。
2、read(byte[]b)
从输入流中读取b.length
个字节到字节数组中,返回读入缓冲区的总字节数,若达到文件末尾,则返回-1。
public int read(byte[]b)throws IOException
3、read(byte[]b,int off,int len)
从输入流中读取最多len个字节到字符数组中(从数组的off位置开始存储字节),当len为0时则返回0,不为0,则将该方法阻塞,直到某些输入可用为止。
4、close()
关闭输入流并释放与该流相关联的所有系统资源。
2.1.3 FilterInputStream
装饰者类,具体的装饰者继承该类,包括BufferedInputStream、DataInputStream和PushbakStream。
2.1.3.1 BufferedInputStream
缓冲流,对节点流进行装饰,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送,效率更高。
2.1.3.2 DataInputStream
数据输入流允许应用程序以与机器无关的方式从底层输入流中读取原始Java数据类型。 应用程序使用数据输出流来写入稍后可由数据输入流读取的数据。
2.1.3.3 PushbakStream
具有1个能回退上一个字节的缓冲区
2.1.4 ObjectInputStream
一般用于反序列化读入
2.1.5 PipedInputStream
用于多线程之间管道通信的输入源
2.1.6 StringbufferInpuStream
用字符串作为输入源
2.1.7 ByteArrayInputStream
字节数组char[] 作为输入源
2.1.8 SequenceInputStream
表示其他输入流的逻辑串联(合并流)
2.2 OutputStream
与InputStream对应。
3、字符流
3.1 Reader
- CharArrayReader 类:将字符数组转换为字符输入流,从中读取字符。
- StringReader 类:将字符串转换为字符输入流,从中读取字符。
- BufferedReader 类:为其他字符输入流提供读缓冲区。
- PipedReader 类:连接到一个 PipedWriter。
- InputStreamReader 类:将字节输入流转换为字符输入流,可以指定字符编码。
3.2 Writer
- CharArrayWriter 类:向内存缓冲区的字符数组写数据。
- StringWriter 类:向内存缓冲区的字符串(StringBuffer)写数据。
- BufferedWriter 类:为其他字符输出流提供写缓冲区。
- PipedWriter 类:连接到一个 PipedReader。
- OutputStreamReader 类:将字节输出流转换为字符输出流,可以指定字符编码。
字符流与字节流的区别:
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。
即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。