一:概念
IO流:input和output的简称,用来处理设备之间数据的传输。
java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按照操作数据分为两种:字符流和字节流
流按流向分为:输入流和输出流
二:字符流的由来ascii
由于计算机只能识别二进制数据 ,故早期的流都是二进制的,像媒体文件等所有的文件都是可以通过字节流来处理的,后来人们将文本类的文件单独分离出来,这些文本文件经常使用,就弄了个字符流,以美国为例,将abcd等26个字母和一些其他的字符分别和二进制数对应起来,例如‘a’对应的是1000001(十进制为65),这样成立的就是ASCII码,当人们输入'a'时,在计算机中实际存储的是1000001这个二进制数,中国也将汉字与二进制数一一对应映射为了GBK码。但是这样每个国家都有一个编码表,不利于维护,且容易出现乱码,后来国际组织将世界上所有国家的语言与二进制数一一对应生成了unicode码表,在unicode码表中每个字符都占用两个字节,比较浪费空间,例如一个字母'a'为1000001,只需要一个字节就能存储了,如果用两个字节来存它比较浪费,故在unicode的基础上优化产生了UTF-8码表,在UTF-8码表中,需要几个字节就分配几个字节,这样比较合理。
三:乱码的由来与解决
由来:
我的电脑采用的是GBK编码,当我在电脑中如果汉字“我”时,那么就会去查GBK表,将汉字“我”在GBK表中对于的二进制数存入计算机中,如果这些保存的二进制数要显示在采用UTF-8编码的电脑上,那么会去查UTF-8表,此时UTF-8中该二进制对于的汉字肯定就 不是“我”了,这就产生了乱码
解决:
通过字符流来解决,这也是字符流产生的原因之一,字符流对象中融入了编码,就是说我们在字符流操作数据时可以指定编码,例如我在存入时指定为GBK编码,在读取时也指定为GBK编码,这样就不会出现乱码了。
四:使用时机
字符流:对于文本类的使用字符流比较合适
字节流:对于媒体类图片类的使用字节流,因为媒体和图片总不能映射为编码表吧,通用的是字节流,因为字符流也是基于字节流的,字节流可以处理所有类型的文件
五:IO流常用基类
1.字节流的抽象基类
- InputStream
- OutputStream
2.字符流的抽象基类
- Reader
- Writer
注:以这四个基类派生出来的子类都是以其父类为后缀,例如InputStream的子类FileInputStream;Reader的子类FileReader;