流可以理解为一个有顺序的,有起点和终点的数据序列,输入流表示从一个源读取数据,输出流表示向一个目标写数据。
字节流和字符流
字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质是基于字节流读取时,去查了查指定的码表。
字节流和字符流的区别:
- 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
- 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
只要是处理纯文本数据,优先考虑使用字符流,除此之外使用字节流。
- 字节输入流InputStream
- InputStream是所有输入字节流的父类,它是一个抽象类
- ByteArrayInputStream,StringBufferInputStream(废弃),FileInputStream是三种基本介质流,分别从Byte[],StringBuffer,和本地文件中读取数据。PipedInputStream是从与其它线程共用的管道中读取数据。
- ObjectInputStream和所有的FilterInputStream的子类都是装饰流。
- 字节输出流OutputStream
- OutputStream是所有输出字节流的父类,它是一个抽象类
- ByteArrayOutputStream,FileOutputStream是两种基本介质流,分别向Byte[]和本地文件中写入数据。PipedOutputStream是向与其它线程共用的管道中写入数据。
- ObjectOutputStream和所有的FilterOutputStream的子类都是装饰流。
- PrintStream可以认为是一个辅助工具,主要可以向其他输出流或者FileInputStream写入数据,本身内部实现还是带缓冲的。是对其他流综合应用的一个工具,System.out就是PrintStream的实例。
- 字符输入流Reader
- Reader是所有字符输入流的父类,它是一个抽象类。
- CharArrayReader,StrignReader是两种基本的介质流,他们分别从char[],String中读取数据,PipedReader是从与其它线程共用的管道中读取数据。
- BufferedReader是一个装饰器,负责装饰其它Reader对象
- FilterReader是所有自定义装饰流的父类,其子类PushbackReader对Reader对象进行装饰,会增加一个行号。
- InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader是一个达到此功能的工具类。
- 字符输出流Writer
- Writer是所有字符输出流的父类,它是一个抽象类。
- CharArrayWriter,StringWriter是两种基本的介质流,他们分别向char[],String中写入数据,PipedWriter是向与其它线程共用的管道中写入数据。
- BufferedWriter是一个装饰器,为Writer提供缓冲功能。
- PrintWriter和PrintStream极其相似,功能和使用也相似。
- OutputStreamWriter是一个连接字节流和字符流的桥梁,它将字符流转变为字节流。FileWriter是一个达到此功能的工具类。