1 IO流概述和分类【理解】
IO流介绍
IO:输入/输出(Input/Output)
流:是一种抽象概念,是对数据传输的总称.也就是说数据在设备间的传输称为流,流的本质是数据传输
IO流就是用来处理设备间数据传输问题的.常见的应用: 文件复制; 文件上传; 文件下载
IO流的分类 按照数据的流向
输入流:读数据
输出流:写数据
按照数据类型来分
字节流 字节输入流 字节输出流
字符流 字符输入流 字符输出流
IO流的使用场景 如果操作的是纯文本文件,优先使用字符流 如果操作的是图片、视频、音频等二进制文件,优先使用字节流 如果不确定文件类型,优先使用字节流.字节流是万能的流
1.2 字节流写数据【应用】
字节流抽象基类 InputStream:这个抽象类是表示字节输入流的所有类的超类 OutputStream:这个抽象类是表示字节输出流的所有类的超类 子类名特点:子类名称都是以其父类名作为子类名的后缀
字节输出流 FileOutputStream(String name):创建文件输出流以指定的名称写入文件
使用字节输出流写数据的步骤
创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对 象指向文件) 调用字节输出流对象的写数据方法 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
1.3 字节缓冲流
字节缓冲流介绍
BufferOutputStream:该类实现缓冲输出流.通过设置这样的输出流,应用程序可以向 底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组.当从流 中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
构造方法;
2 字符流
2.1 字符流
由于字节流操作中文不是特别的方便,所以Java就提供字符流
字符流 = 字节流 + 编码表
计算机当中存储的信息都是用二进制表示的;
按照某种规则,将字符变成二进制,再存储到计算机中称为编码
按照同样的规则,将存储在计算机当中的二进制数据解析显示出来称为解码
编码和解码方式必须要保持一致,否则会出现乱码
编码和解码举例: 字符a在ascii当中的编码是97,我们需要将97转换成二进制保存到计算机,这就是编码;
读取的时候,先把二进制解析出来,再转换成97,最后通过查找97是字符a,这就是解码;
中文的字节存储方式 用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼 接成中文, 如何识别是中文的呢? 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数
2.2 字符流写数据
字符流在底层其实是字节流+编码表两者相结合的方式
Writer: 用于写入字符流的抽象父类
FileWriter: 用于写入字符流的常用子类
2.3 字符流读数据
Reader: 用于读取字符流的抽象父 FileReader: 用于读取字符流的常用子类
2.4 字符缓冲流
字符缓冲流
BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途 BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途
构造方法
3. 转换流
3.1 字符流中和编码解码问题相关的两个类
InputStreamReader:是从字节流到字符流的桥梁,父类是Reader 它读取字节,并使用指定的编码将其解码为字符 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
OutputStreamWriter:是从字符流到字节流的桥梁,父类是Writer 是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
4. 打印流
5. 数据流