IO流-你需要掌握的知识点

1. IO流(Input,Output):用来实现设备之间的数据传输 相对于内存

按照方向分类:输入流,输出流 (相对于内存) 对内存写进数据就是输入流(从文件读取数据),对内存取出数据就是输出流(将数据写进文件)

按照操作的数据分类:

1)字节流:可以操作任何类型的数据,如文本、图片、视频、音频等

InputStream 字节输入流父类 ​ OutputStream 字节输出流父类

2)字符流:只能操作文本数据因为字符涉及到编码,在字节流的基础上加入了编码。为了方便操作文本数据

Reader 字符输入流父类(抽象类) ​ Writer 字符输出流父类(抽象类)

读取数据 ---> read(byte[] b) read(char[] c) --> 就是根据不同的流,可以确定流中的数据,此时可以选择不同的 数组用来存储数据,字节/字符 数组来完成 读取数据时,定义的数组含义有两个: 1)读取文件中内容的长度 ,即 数组的长度 2)读取文件内容后会将文件中的内容存储到这个数组中,以便在输出流中进行数据写出 ​ 注意:向数组中写数据的时候,每次都是从0(即数组第一个位置)开始写而不是完全覆盖,若最后一次读取的内容不能完全填充整个数组,此时没有填充到内容的位置就会残留上次读取的内容。 read() 方法有一个返回值,这个值是文件中读取内容的实际长度,这个长度会被用在写出流。 ​

写出数据 ---> write(byte[] b,int off ,int len) write(char[] b,int off ,int len) 注意:int off --> 从数组中什么位置开始写出数据 --> 0开始, 数组不是覆盖不操作,所以每次数组第一个位置 即0的位置是最新数据;int len --> 实际读取文件的长度(文件中的内容) --> 由read() 方法的返回值得来 -->防止写出数据时,无用数据被写出;写出数据时可以添加一个方法 flush --> 刷新 加快流的流速 ,多用于网络流或大文件读取写出。 无论输入输出,无论字节字符, 他们都用一个通用的方法 --> close 关闭(必须关闭)。

java中使用IO流的原理:如向文件写入数据(对于内存即为输出)时,将输出流对象与目标文件关联起来;从文件中读取数据(对于内存即输入),此时输入流对象与目标文件关联。

3)字符编码的发展历程:

       阶段1: 计算机只认识数字,我们在计算机里一切数据都是以数字来表示,因为英文符号有限,所以规定使用的字节的最高位是 0 。每一个字节都是以 0~127 之间的数字来表示,比如A对应65,a对应97。这就是美国标准信息交换码-ASCII.

        阶段2: 随着计算机在全球的普及,很多国家和地区都把自己的字符引入了计算机,比如汉字。此时发现一个字节能表示数字范围大小,不能包含所有的中文汉字,那么就规定使用两个字节来表示一个汉字。

       规定:原有的ASCII字符的编码保持不变,仍然使用一个字节表示,为了区别一个中文字符与两个ASCII码字 符,中文字符的每个字节最高位规定为1(中文的二进制是负数)。这个规范就是GB2312编码,后来在GB2312的基础上增加了更多的中文字符,比如汉字,也就出现了GBK。 阶段3: 新的问题,在中国是认识汉字的,但是如果把汉字传递给其他国家,该国家的码表中没有收录汉字,其实就显示另一个符号或者乱码。为了解决各个国家因为本地化字符编码带来的影响,咱们就把全世界所有的符号统一进行编码-Unicode 编码。此时某一个字符在全世界任何地方都是固定的,比如'哥',在任何地方都是以十六进制的54E5来表示。Unicode的编码字符都占有2个字节大小。

4)常见的字符集:

ASCII: 占一个字节,只能包含128个符号,不能表示汉字 ISO-8859-1(latin-1):占一个字节,收录西欧语言,不能表示汉字。 ANSI:占两个字节,在简体中文的操作系统中 ANSI 就指的是 GB2312。                                                             GB2312/GBK/GB18030:占两个字节,支持中文。                                                                                                                          UTF-8:是一种针对Unicode的可变长度字符编码,又称万国码,是Unicode的实现方式之一。 编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可 继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。                UTF-8 BOM:是MS搞出来的编码,默认占3个字节,不要使用这个。

2. 转换流

       如果拷贝音频、视频、图片、压缩包等等这样的二进制文件时,需要使用字节流;如果拷贝文本文件时,为了防止字节流出现乱码问题,使用字符流;虽然字节流拷贝的东西比较多,但只对文件处理时可能会出现乱码问题,提供一种方式解决这一问题------>无论读取什么样的数据都使用字节流。读取文本文时,Java提供一种流,这个流可以将字节流转换为字符流 --> InputStreamReader / OutputStreamWriter      (读取文件时是什么编码集 ,写出文件时就是什么编码集) (读取文件时是什么编码集 ,写出文件时就可以改变编码集) (读取文件时编码集错误,写出文件时无论怎么样修改啊,文件的编码都是错的)

InputStreamReader 字节字符转换输入流 --> 将字节流转为字符流 是从字节流到字符流的桥梁:它读取字节,并使用指定的 charset 将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。 每次调用一个 inputStreamReader 的 read() 方法可能会导致从底层字节输入流读取一个或多个字节,为了实现字节到字符的有效转换,可以从底层流读取比满足当前读取操作所需要的更多字节。

//常用构造方法:
InputStreamReader(InputStream in) //使用字节输入流创建转换输入流对象,使用默认编码集
InputStreamReader(InputStream in, Charset cs) //使用字节输入流创建转换输入流对象,使用Charset进行指定编码集
InputStreamReader(InputStream in, String charsetName) //使用字节输入流创建转换输入流对象,使用字符串的形式指定编码集
//常用方法
int read(char[] cbuf) //读取数组中长度的内容,并写入到数组数组中
void close()  //关闭流并释放与之相关联的任何系统资源。

OutputStreamWriter 字节字符转换输出流 --> 将字符流转换字节流 是从字符流到字节流的桥梁:将写入的字符使用指定的charset 编码为字节。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。 每次调用 writ() 方法都会对定字符调用编码转换器,所得到的字节在写入底层输出流之前累积在缓冲区中,可以指定此缓冲区的大小,但是默认情况下它足够大,可以用于大多数目的。 请注意传递给 write() 方法的字符没有缓冲。

//常用构造方法
OutputStreamWriter(OutputStream out)  //创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs)
OutputStreamWriter(OutputStream out, String charsetName)
//常用方法
void write(char[] cbuf, int off, int len)
void close()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值