文章目录
前言
字节缓冲流和字符缓冲流只有一字之差,却有着很大的区别。更是它们相互之间缠绕不休的处境。
一、 字节流写数据
字节流中的输入字节流超类是InputStream
字节流中的输出字节流超类是OutputStream
子类名称都是以父类名称做为子类名的后缀的
FileOutputStream:文件输出流用于将数据写入File中
FilOutputStream(String name):创建文件输出流以指定的名称写入文件
1.1 字节流写数据的重要步骤
- 创建FileOutputStream对象,关联到一个文件路径
1.1:创建字节输出流对象
1.1.1:调用系统功能创建了文件
1.1.2:创建字节输出流对象
1.1.3:让字节输出流对象指向文件 - 调用write()方法,写出数据
- 调用close()方法,释放资源
- 打开文件,查看内容
1.2 字节流写数据的三种方式
void write(int b)
将指定的字节写入此文件输出流一次写一个字节数据
void write(byte[] b)
将b.length字节从指定的字节数组写入此文件输出流一次写一个字节数组数据
void write(byte[] b,int off,int len)
将len字节从指定字节数组开始,从偏移量off开始写入此文件输出流一次写一个字节数组的部分数据
off:偏移量,也就是数组的下标
len:长度,也就是想要输出的数组中的多少个字节
1.3 如何写换行
调用write()方法,写出"\r\n".getBytes()即可
1.4 如何文件续写
- 使用FileOutputStream(String name,boolean append)构造方法
- 构造方法中的第二个参数传递true,则在文件末尾继续写数据
1.5 字节流写数据加异常处理
- finally:在异常处理时提供finally块来执行所有清楚操作。比如说IO流中的释放资源
特点:被finally控制的语句一定会执行,除非JVM退出 - 重要步骤
将创建字节流对象和写出数据的代码放在try中
在catch中捕获IOException异常
在finally中进行释放资源
1.6 字节流读数据(一次读一个字节数据)
- 需求:把文件fos.txt中的内容读取出来在控制台输出
- FileInputStream:从文件系统中的文件获取输入字节
FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name来命名 - 使用字节输入流读数据的步骤
创建字节输入流对象
调用字节输入流对象的读数据方法
释放资源
二、 字符流
2.1 为什么出现字符流
- 由于字节流操作中文不是特别的方便,所以Java就是提供字符流
字符流=字节流+编码表 - 用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼成中文,如何识别是中文的呢?汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。
2.2 编码表
- 基础知识:
1.1:计算机中存储的信息都是用二进制数表示的;
1.2:按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来的,称为解码。
1.3:字符编码:就是一套自然语言的字符与二进制数之间的对应规则(A , 65) - UTF-8编码:
可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四字节为每个字符编码。 - GBXXX字符集:
GB2312:简体中文码表。一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000个简体汉字,此外数学符号、罗马希腊的字母、日文的假名等都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”字符了。
GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。
2.3 字符串中的编码解码问题
- 编码:
byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中 - 解码:
String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新String
String(byte[] byte,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String - 字符流中和编码解码问题相关的两个类:
InputSreamReader
OutputStreamWriter - 和编码相关的构造方法:
InputStreamReader(InputStream in String charSetName)
OutputStreamWriter(OutputStream out,String charSetName)
2.4 字符流中的编码解码问题
- 字符流抽象基类
Reader:
字符输入流的基类
Writer:
字符输出流的抽象类 - 字符流中和编码解码问题相关的两个类:
InputStreamReader
OutputStreamWriter
2.5 字符流写数据的5中方式
void write(int c)
写入一个字符
void write(char[] cbuf)
写入一个字符数组
void write(char[] cbuf,int off,int len)
写入字符数组的一部分
void write(String str)
写一个字符串
void write(String str,int off,int len)
写一个字符串的一部分
2.6 字符流读数据的2中方式
int read()
一次读一个字符数据
int read(char[] cbuf)
一次读一个字符数组数据
2.7 字符缓冲流
- 字符缓冲流
BufferedWriter:将文本写入字符输出流、缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途。 - 构造方法:
BufferedWriter(Writer out)
BufferedReader(Reader in)
2.8 字符缓冲流特有功能
- BufferedWriter:
void newLine():写一行分隔符,行分隔符字符串由系统属性定义 - BufferedReader:
public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
总结
没有总结,上面的内容就是总结。