大家好,又见面了,我是你们的朋友全栈君。
OutputStreamWriter 是字符流通向字节流的桥梁:使用指定编码将写入流中字符编码成字节,在将字节写入输出流
抽象类Writer的实现类(如OutputStreamWriter )调用write()会其输出立即发送到底层字符或字节流,但是每次调用开销很大,建议用 BufferedWriter 包装所有其 write() 操作
Java内存中数据表现形式一般为字符,当将内存中字符数据输出到本地文件时就会用到OutputStreamWriter:
数据从内存中写入硬盘时,顺序是:
缓冲流 -> 转化流 -> 文件流
缓冲流是字符流
文件流是字节流
转化流就是OutputStreamWriter,所以OutputStreamWriter是字符流到字节流的桥梁
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
比如bufferWriter.write(“待输出”),bufferWriter会将字符串【待输出】缓存到缓冲区中,缓冲区是一个字符char数组,默认大小是8192
当缓冲区满了,将缓冲区传给底层输出流: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中字节写入底层输出流
刷新该流的缓冲,防止缓冲区中还存在部分数据没有写入底层输出流
@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) {
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/194846.html原文链接:https://javaforall.cn