Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
1.字节流——InputStream/OutputStream
InputStream 和 OutputStream 是两个 字节流的顶层抽象类,其他字节流处理类都继承于它们。
1.1 ByteArrayInputStream ——把内存中的一个缓冲区作为 InputStream
1.2 StringBufferInputStream ——把一个 String 对象作为 InputStream
1.3 FileInputStream ——把一个文件作为 InputStream
1.4 PipedInputStream ——实现了管道,主要在线程中使用
1.5 SequenceInputStream——把多个 InputStream 合并为一个 InputStream
1.6 各个输出流与输入流类似。
2.字符流——Reader/Writer
类似的,Reader/Writer 是两个 字符流的顶层抽象类,其他字符流处理类都继承于它们。
2.1 CharArrayReader ——与 ByteArrayInputStream 对应此类实现一个可用作字符输入流的字符缓冲区
2.2 StringReader —— 与 StringBufferInputStream 对应其源为一个字符串的字符流。
2.3 StringReader(String)—— 创建一新的串读取者
2.4 FileReader —— 与 FileInputStream 对应
2.5 PipedReader ——与 PipedInputStream 对应
2.6 各个输出流与输入流类似。
3.字符流与字节流转换:
3.1字符流转换为字节流
InputStream input = new ByteArrayInputStream(byte[] buf) ;将byte作为字符流的缓冲区。
3.2字节流封装为字符流
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
4.字符流、字节流用法摘要
4.1、按数据来源(去向)分类:
1 )、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )
2 )、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )
3 )、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
4 )、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )
5 )、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )
4.2、按是否格式化输出分:
1) 、要格式化输出: PrintStream, PrintWriter
4.3、按是否要缓冲分:
1) 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )
4.4、按数据格式分:
1)、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类
2) 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类
4.5、按输入输出分:
1) 、输入: Reader, InputStream 类型的子类
2) 、输出: Writer, OutputStream 类型的子类