ByteArrayInputStream,ByteArrayOutputStream | 从字节数组中读取和向字节数组中写入,有些时候可以认为是流和为字节数组相互转换,有时候在某些第三方sdk中很有用 |
FileInputStream,FileOutputStream | 向文件中写入和从文件中读取内容 |
PipedInputStream,PipedOutputStream | 在两个线程间传递数据,原理简单说就是,两个流作为两个线程的公共变量,PipedInputStream维护了一个字节数组,两个流通过读取和写入这个字节数组来完成数据交换 |
SequenceInputStream | 可以把多个流串联在一起,顺序读取每个流 |
FilterInputStream,FilterOutputStream | 包装流。对输入输出流进行过滤,但是默认并没进行任何其他的操作,需要开发者自行重写响应方法来进行过滤操作 |
BufferedInputStream,BufferedOutputStream | 包装流。为其他流提供内存缓冲区,已BufferedOutputStream为例,在流中的数据写入目标之前,先存放在缓冲区,等缓冲区满了,在批量的流入目标。缓冲流的目的在于减少io操作,可用于写文件,网络传输数据等场景 |
CheckedInputStream,CheckedOutputStream | 包装流。对数据进行校验,像crc校验等 |
DataOutputStream,DataInputStream | 包装流,可以使基本数据类型和字符串与字节相互转换,用于写入和读取。举个例子,如果我们向文件中存储整数10000,一种方式我们可以直接向文件中写入字符串"10000",读的时候在通过Integer.valueOf(“10000”)转换为整型;另一种方式是,将整数10000(整型4用个字节表示)拆分成四个字节写入文件,读的时候在把四个字节合并为一个整型,这就是这两个流的做法。效率来说后者更高,因为他不需要编码转换(将“10000”用utf-8等编码为字节然后存储)和类型转换(将“10000”转换为整数10);存储成本来说,也是后者更少,前者编码转换后需要5个字节,而后者只需4个字节。 |
DeflaterOutputStream,DeflaterInputStream,InflaterOutputStream ,InflaterInputStream ,ZipOutputStream,ZipInputStream,GZIPOutputStream,GZIPInputStream,JarOutputStream,JarInputStream | 包装流,用于压缩和解压 |
DigestOutputStream,DigestInputStream | 包装流。消息摘要流,验证流数据的安全性和完整性(如md5)类似crc校验 |
PrintStream | 包装流。输出字符流,将所有的基本类型转换为字符串输出(使用默认编码)。如,boolean,打印true或false,空指针则打印null |
OutputStreamWriter,InputStreamReader | 包装流,简单点说就是字节和字符的相互转换,转换的方式和DataOutputStream,DataInputStream不一样,其使用的是字符编码的方式 |
FileReader,FileWriter | 对应了FileInputStream,FileOutputStream的字符操作方式 |
BufferedReader,BufferedWriter | 对应了BufferedInputStream,BufferedOutputStream的字符操作方式 |
LineNumberReader | 继承了BufferedReader,实现了获取行号的功能 |
CharArrayReader,CharArrayWriter | 对应了ByteArrayInputStream,ByteArrayOutputStream的字符操作方式 |
CharArrayReader,CharArrayWriter | 对应了PipedInputStream,PipedOutputStream的字符操作方式 |
StringReader,StringWriter | 简单字符串工具 ,StringWriter 使用StringBuffer |