JAVA字节流、字符流、缓冲流、转换流、内存流、字符编码


JAVA字节流、字符流、缓冲流、转换流、内存流、字符编码

文章插图
文件流、字节流、字符流、缓冲流、转换流、内存流
文件流: 在JAVA 中 , 文件流负责操作文件 , 包括读取和写入;
FileInputStream// 文件的字节输入流;FileOutputStream// 文件的字节输出流;FileReader// 文件的字符输入流;FileWriter// 文件的字符输出流;FileInputStream 和 FileOutputStream的父类分别是InputStream和OutputStream , 都是字节流 , 以面向字节的形式提供IO操作 。FileReader 和 FileWriter的父类则是Reader和Writer , 都是字符流 , 字符流以面向字符提供IO操作 , 同时 , 字符流兼容Unicode , 能够提供更好的国际化支持 。
在读取数据时 , 字节流的数据存储单位是字节 , 在接收字节流数据时 , 会新建一个字节类型的数组(byte[])来接收读取的数据;字符流的数据存储单位是字符 , 在接收字符流数据时 , 会新建一个字符类组(char[])的数据来接收读取的数据 。
InputStream 和 OutputStreamInputStream:
InputStream及其子类的作用是用来表示不同数据源输入数据的类 , 其中封装了用于从数据源中读取数据的操作 。这些数据源包括:
  • 字节数组:byte[];
  • String对象;
  • 资源文件:File;
  • 资源管道;
  • 其他流组成的流序列;
  • 其他数据源 , 如网络资源;
InputStream子类:
  • ByteArrayInputStream:将内存的缓冲区当作数据源输入;
  • StringBufferInputStream:将String转换成InputStream;
  • FileInputStream:从本地文件中读取数据;
  • PipedInputStream:资源管道的输入端 , 也是PipedOutputStream的输入源;
  • SequenceInputStream:能够将2个或者以上的InputStream合并成一个单一的InputStream;
  • FileterInputStream:为文件资源读取提供筛选功能;
 
OutputStream:
OutputStream及其子类的作用是用来表示数据输出将要去向的目标 , 比如:文件、资源管道、字节数组等 。OutputStream也是因不同的目标有不同的子类:
  • ByteArrayOutputStream:在内存中创建缓冲区 , 所有输出的数据都会暂存在缓冲区中;
  • FileOutputStream:将数据写出到文件中;
  • PipedOutputStream:作为PipedInputStream的输出端 , 与PipedInputStream一起实现资源的“管道化”;
  • FileterOutputStream:为文件资源写出提供筛选功能;
 
Reader 和 Writer字符流有着和字节流近乎一样的功能 , 每个字节流api都能在字符流中找到与之相对应的 , 而且 , 字符流比字节流有着更好的性能;尽管如此 , 字符流的设计并不是为了取代字节流 , 相反 , 二者同时存在 , 相辅相成 。
Reader 和 Writer及其子类都提供了对Unicode的支持 , 这是他们和InputStream与OutputStream系拓展最大的不同 , 详细如下图所示:
JAVA字节流、字符流、缓冲流、转换流、内存流、字符编码

文章插图
字节流和字符流的api对应
 
文件过滤器Java IO中提供了过滤器:FilterInputStream和FilterOutputstream , 用于筛选特定的输入流和输出流 。因为FilterInputStream和FilterOutputstream也是自InputStream与OutputStream继承而来 , 所以他们都可以读写来自InputStream与OutputStream的数据 。
FilterInputStream子类:
  • DataInputStream:用于从流中读取基本类型的数据 , 比如:char、int、long等 , 往往与DataOutputStream配合使用;
  • BufferedInputStream:代表“缓冲区” , 可以将数据暂存在缓冲区 , 使用它可以防止每次读取都进行实际的写操作;
  • LineNumberInputStream:追踪输入流中的行号 , 可做调试用;
  • PushbackInputStream:能弹出一个字节的缓冲区 , 能够将文件的最后一个字符返回(操作系统使用-1表示磁盘文件的结尾标记) , 通常作为编译器的扫描器 , 往往被编译器调用;
 
FilterOutputStream子类: