outputstreamwriter.write_writevalueasstring

outputstreamwriter.write_writevalueasstring一.输出流1.1字节输出流OutputStream在java中,字节是占1个字节,即8位字节输出流OutputStream-将指定的字节写入此输出流1.2字符流Writer在java中,字符是占2个Byte,即16位字符输出流Writer-将字符写入此输出流,字符流的操作比字节流操作好在一点,比如可以直接输出字符串1.3OutputStreamWri

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一. 输出流

1.1 字节输出流OutputStream

  1. 在java中,字节是占1个字节,即8位
  2. 字节输出流OutputStream – 将指定的字节写入此输出流

1.2 字符流Writer

  1. 在java中,字符是占2个Byte,即16位
  2. 字符输出流Writer – 将字符写入此输出流,字符流的操作比字节流操作好在一点,比如可以直接输出字符串

1.3 OutputStreamWriter

OutputStreamWriter 是字符流通向字节流的桥梁:使用指定编码将写入流中字符编码成字节,在将字节写入输出流

  1. OutputStreamWriter 每次调用write()方法都会使用给定字符集对待输出字符编码,编码过程开销是很大的
  2. 为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器

1.4 BufferedWriter

抽象类Writer的实现类(如OutputStreamWriter )调用write()会其输出立即发送到底层字符或字节流,但是每次调用开销很大,建议用 BufferedWriter 包装所有其 write() 操作

  1. BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
  2. BufferedWriter 缓冲区为字符数组,默认大小为8192
  3. Writer在clise()之前要调用flush(),将缓冲区中存在数据写入底层输入流

二. OutputStreamWriter输出过程

2.1 内存数据输出

Java内存中数据表现形式一般为字符,当将内存中字符数据输出到本地文件时就会用到OutputStreamWriter:

数据从内存中写入硬盘时,顺序是:
缓冲流 -> 转化流 -> 文件流
缓冲流是字符流
文件流是字节流
转化流就是OutputStreamWriter,所以OutputStreamWriter是字符流到字节流的桥梁

2.2 使用缓冲区

  1. OutputStreamWriter实例每次调用write()方法都会在给定字符(或字符集)上调用编码转换器,即将写入字符根据指定的字符集编码成字节,然后写入到底层输出流中
  2. 由于每次调用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) {
            }

        }
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194846.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月28日 下午9:22
下一篇 2025年10月28日 下午10:01


相关推荐

  • 十六进制颜色值对照表

    十六进制颜色值对照表用 MarkDown 写博客 有时会用到字体颜色 在网上找了一份十六进制颜色对照表 颜色名十六进制颜色值颜色 Red FF0000rgb 255 0 0 Yellow FFFF00rgb 255 255 0 Blue 0000FFrgb 0 0 255 Green 008000rgb 0 128 0 Orange FFA500rgb 255 165 0 Indigo 4B0082r

    2026年3月19日
    2
  • java 字符串 转日期,Java字符串转日期或日期转字

    java 字符串 转日期,Java字符串转日期或日期转字用的 API 是 SimpleDateFo 它是属于 java text SimpleDateFo 所以请记得 import 进来 用法 SimpleDateFo newSimpleDat yyyy MM ddHH mm ss 这一行最重要 它确立了转换的格式 yyyy 是完整的公元年 MM 是月份 dd 是日期 至于 HH mm ss 就不需要我再解

    2026年3月18日
    1
  • grok-prompts 的安装和配置教程

    grok-prompts 的安装和配置教程

    2026年3月15日
    2
  • AAA认证及RADIUS配置「建议收藏」

    AAA认证及RADIUS配置「建议收藏」AAA认证及RADIUS配置AAA简介AAA是Authentication,AuthorizationandAccounting(认证、授权和计费)的简称,它提供了一个对认证、授权和计费这三种安全功能进行配置的一致性框架,实际上是对网络安全的一种管理。这里的网络安全主要是指访问控制,包括:.哪些用户可以访问网络服务器。.具有访问权的用户可以得到…

    2022年5月25日
    66
  • 如何查看端口是否打开

    如何查看端口是否打开http blog sina com cn s blog 6bb7ebcc0101 htmlapache 安装好以后 在本机可以用 http localhost 或者 http 127 0 0 1 进行访问 但是 在外网 相对本机来说的 局域网也算 不能访问 这种情况可以分为两个问题 第一个是在局域网内 第二国是在互联网 有三种情况可能造成这种现象 1 配置文件没有设置外网访

    2026年3月19日
    2
  • Java基础入门笔记06——String类和StringBuffer类,Java中的三大集合,Set集合,List集合,Map集合,Collection类

    Java基础入门笔记06——String类和StringBuffer类,Java中的三大集合,Set集合,List集合,Map集合,Collection类常用类String类和StringBuffer类String类不能改变串对象中的内容,每次操作后都产生一个新串StringBuffer类可以实现字符串动态改变,对原对象增删改查equals()和”==”的区别equals()仅判断值是否相等“==”判断值还要判断引用是否相等length():获取字符串的字符个数length:获取数组长度toCharArray():将字符串对象转换为字符数组Java的三种集合都是接口,需要具体实现集合类存在于java.util包中,是一个用来存放

    2022年8月8日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号