IO—02IO的流的介绍
一、IO流的概念
流是一组有顺序的,有起点和终点的字节的集合,是对数据传输的总称或抽象
* 流和本质:数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
* 流的作用:为数据源和目的地建立了一个输送通道
* java中所有的传统的流的形式都在java.io的包下,用于实现输入和输出功能
二、流的分类
1、按 流的方向 分
输入流:只能从中读取数据,不能向其写数据
输出流:只能向其写数据,不能读数据
输入流:指从数据源介质(磁盘、光盘、网络、鼠标、键盘)到当前内存(内存
输出流:指从程序(内存)到目的地介质(磁盘、光盘、屏幕、网络)
*输入流基类:inputStream、Reader
输出流基类:OutputStream、Writer*
2、按 操作单元 分
操作单元:字节流 字符流
字节流操作的是单元是数据成员是8位的字节,字符流操作的是数据单元为16位的字符
*字符流基类:Reader、Writer
字节流基类:InputStream、OutputStream*
3、按 流的角色 分
节点流:直接和数据源连接,称之为节点流,也叫做低级流
处理流:是不能直接和数据源连接,对于一个已存在的流进行的连接和封装 也叫做高级流
三、字节流和字符流的区别
字节流已字节为单位8bit位,
* 电脑存储的数据以二进制存储,01010100
*
* 字符流的由来,因为数据编码的不同,因而有了对字符进行高效操作的流对象,本质其实就是基于字节流读取时,去查了指定的码表
* 字符流和字节流的区别:
* & **读写单位不同:**字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读取多个字节。
* & **处理对象不同:**字节流能处理所有类型的数据(如图片、avi等),字符流只能处理纯文本的数据。
* & **处理效率不同:**字节流效率较高,直接进行读取,字符流效率较低,涉及到编码解码过程
* & **可移植性不同:**字节流可移植性高,和平台无关,字符流需要考虑编码解码过程,编码和解码的码表需保持一致
*
* 字符集编码:
* 计算机底层存储的数据都是二进制存储
* 字符“a” 存储 --》码表
* 码表:将字符和数字建立起来的映射关系,字节和字符的相互转换
* 字符->字节 :编码过程 “hello” getBytes()方法,转换成字节
* 字节-》字符:解码过程 byte[]bys=new Byte{97,98,99} new String(bys);------abc
*
四、字符集编码
可以解决乱码问题(由于编码不一致)
ASCII码:一个字符+中的7位表示,对应的字节都是整数 0—XXXXXXX
* ISO-8899-1:拉丁码表:用一个字节中8位表示,可以表示整数和负数
* GBK:中文码表:用2个字节表示,2个字节中第一个字节高位为1,第二个字节高位为0
* Unicode:国际标准码表,无论什么文字,都是2个字节
* UTF-8:基于Unicode,一个字节表示存储信息,每一个字节头加入了编码信息
Charset这个类可以操作字符集编码有关的操作
//获取当前系统默认的编码格式
Charset charset = Charset.defaultCharset();
System.out.println(charset );
//当前系统支持的所有的字符集编码
SortedMap<String, Charset> stringCharsetSortedMap = Charset.availableCharsets();
Iterator<Map.Entry<String, Charset>> iterator = stringCharsetSortedMap.entrySet().iterator();
while (iterator .hasNext() ){
Map.Entry<String, Charset> next = iterator.next();
System.out.println(next .getKey() +next .getValue() );
}
//判断是否支持
Charset .isSupported("Utf-8");