大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
一. 输出流
1.1 字节输出流OutputStream
- 在java中,字节是占1个字节,即8位
- 字节输出流OutputStream – 将指定的字节写入此输出流
1.2 字符流Writer
- 在java中,字符是占2个Byte,即16位
- 字符输出流Writer – 将字符写入此输出流,字符流的操作比字节流操作好在一点,比如可以直接输出字符串
1.3 OutputStreamWriter
OutputStreamWriter 是字符流通向字节流的桥梁:使用指定编码将写入流中字符编码成字节,在将字节写入输出流
- OutputStreamWriter 每次调用write()方法都会使用给定字符集对待输出字符编码,编码过程开销是很大的
- 为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器
1.4 BufferedWriter
抽象类Writer的实现类(如OutputStreamWriter )调用write()会其输出立即发送到底层字符或字节流,但是每次调用开销很大,建议用 BufferedWriter 包装所有其 write() 操作
- BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
- BufferedWriter 缓冲区为字符数组,默认大小为8192
- Writer在clise()之前要调用flush(),将缓冲区中存在数据写入底层输入流
二. OutputStreamWriter输出过程
2.1 内存数据输出
Java内存中数据表现形式一般为字符,当将内存中字符数据输出到本地文件时就会用到OutputStreamWriter:
数据从内存中写入硬盘时,顺序是:
缓冲流 -> 转化流 -> 文件流
缓冲流是字符流
文件流是字节流
转化流就是OutputStreamWriter,所以OutputStreamWriter是字符流到字节流的桥梁
2.2 使用缓冲区
- OutputStreamWriter实例每次调用write()方法都会在给定字符(或字符集)上调用编码转换器,即将写入字符根据指定的字符集编码成字节,然后写入到底层输出流中
- 由于每次调用write()都会调用转换器,为了提高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
比如bufferWriter.write(“待输出”),bufferWriter会将字符串【待输出】缓存到缓冲区中,缓冲区是一个字符char数组,默认大小是8192
2.3 字符转字节输出
当缓冲区满了,将缓冲区传给底层输出流:nio处理
rt.jar sun.nio.cs.StreamEncoder
StreamEncoder.write(char cbuf[], int off, int len)
1.java.nio.CharBuffer - 字符缓冲区
2.java.nio.charset.CharsetEncoderencode(CharBuffer in, ByteBuffer out, boolean endOfInput) - 将输入字符缓冲区in中字符编码,得到的字节写入输出缓冲区out, 返回编码结果CoderResult
3.java.nio.charset.CoderResult - 编码结果状态的表述
4.sun.nio.cs.StreamEncoder.writeBytes() - 将字节输出缓冲区ByteBuffer中字节写入底层输出流
2.4 close()之前记得flush()
刷新该流的缓冲,防止缓冲区中还存在部分数据没有写入底层输出流
三. OutputStreamWriter输出实例
@Test
public void TestOutputStream() throws Exception {
File file = new File("C:\\Users\\Administrator\\Desktop\\config.conf");
OutputStream fileOutputStream = null;
OutputStreamWriter outputStreamWriter = null;
BufferedWriter bufferedWriter = null;
try {
fileOutputStream = new FileOutputStream(file);
outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK");
bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write("Hello World");
bufferedWriter.newLine();
bufferedWriter.write("Hello Java");
// close前调用flush()
bufferedWriter.flush();
} finally {
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
} catch (Exception e) {
}
try {
if (outputStreamWriter != null) {
outputStreamWriter.close();
}
} catch (Exception e) {
}
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (Exception e) {
}
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/194846.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...