13Java进阶——IO、线程

BufferInputStream 将创建一个内部的缓冲区数组,内部缓冲区数组将根据需要从包含的输入流中重新填充,一次可以读取多个字节

BufferOutputStream 该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

构造方法:传入字节流,可以指定缓冲区大小

bos.write("hello\r\n".getBytes(StandardCharsets.UTF_8));

BufferedOutputStream 内部带有缓冲区 写数据的时候 先写出到缓冲区,缓冲区写满的时候 ,才会将缓冲区的内容写出到磁盘 调用flush方法 只刷新缓冲流 但不释放资源 close方法 在关闭流 释放资源之前 会先刷新缓冲流

为什么缓冲流的构造方法中需要的是一个字节流,而不是具体的文件或者路径呢?

字节缓冲流仅仅提供缓冲区,而真正的读写数据还的移开基本的字节流对象进行操作。

2 字符流 2.1 为什么出现字符流

由于字节流操作中文不是特别方便,所以就出现了字符流

字符流 = 字节流 +字符集

中文字节存储方式

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因就是最终底层操作会自动的进行字节拼接成中文。

如何识别中文?

汉字在存储的时候 无论使用那种编码存储 第一个字节都是负数。

2.2. 字符串中的编码和解码的问题

编码就指的是将字符转换成字节

string.getBytes(),参数可指定String 字符集名

默认的编码 UTF-8

// 解码 编码和解码必须使用相同的码表 否则会出现中文乱码

解码: 将字节数组转换为字符

String(byte[] bytes, String charsetName)构造一个新的String由指定用指定的字节的数组解码charset

2.3. 字符流中的编码问题

字符流的抽象基类:

Reader 字符输入流的抽象基类 编码

Writer 字符输出流的抽象基类 解码

字符流中和编码相关的类:

InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

构造方法:字节流+可选字符集名

使用字符流完成对于中文的写和读

2.4 字符流读写的方式

写:write(字符数组/字符串/字符,起始位置)

刷新和关闭close(),flush()

读:read(字符/字符数组,起始位置)

字符流自带缓冲区

2.5 字符流操作的便捷类

FileReader 是InputStreamReader的简洁形式

FileWriter 是OutputStreamReader的简洁形式

2.6 字符缓冲流

BufferedReader

从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。可以指定缓冲区大小,或者可以使用默认大小。

BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流。

readline()读一行

BufferedWriter

将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。

可以指定缓冲区大小,或者可以接受默认大小。

BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。

newLine()写分隔符

2.7 IO流小结

image-20210729105134952

字节流可以赋值文件数据,有四种方式一般采用字节缓冲流一次去屑一个字节数组的形式。

3 标准输入输出流

PrintStream:err、out

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjzwz.html