OutputStreamWriter 终极解析与记忆指南

news2025/4/19 4:36:24

OutputStreamWriter 终极解析与记忆指南

一、核心本质

OutputStreamWriter 是 Java 提供的字符到字节的桥梁流,属于 Writer 的子类,负责将字符流按指定编码转换为字节流。

注意:OutputStreamWriter也是一个字符流,也是一个转换流。

           OutputStreamWriter是一个编码的过程。

           如果OutputStreamWriter在编码的过程中使用的字符集和文件的字符集不一致时会出现乱码。

           FileWriter是OutputStreamWriter的子类

           FileWriter的出现简化了java代码。

           FileWriter是一个包装流,不是节点流。

核心特性速查表

特性说明
继承链Writer → OutputStreamWriter
核心作用字符流→字节流的转换(编码过程)
编码支持支持所有Java平台可用的字符编码
典型用途处理非默认编码的文本写入
线程安全

二、构造方法

java

// 1. 使用默认字符编码
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out);

// 2. 明确指定字符编码(推荐)
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out, String charsetName);

// 3. 使用Charset对象指定编码(Java 6+)
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out, Charset cs);

标准初始化模板

java

// 写入UTF-8编码文件
try (Writer writer = new OutputStreamWriter(
        new FileOutputStream("data.txt"), StandardCharsets.UTF_8)) {
    writer.write("你好,世界!");
}

三、核心方法

方法作用
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)写入字符串的指定部分
void flush()强制将缓冲区内容写入底层流
void close()先调用flush(),再关闭流
String getEncoding()获取当前使用的字符编码名称

四、工作原理图解

mermaid

flowchart LR
    A[字符流] --> B[OutputStreamWriter] 
    B --> C{编码过程}
    C --> D[字节流]
    style B fill:#f9f,stroke:#333
  1. 输入:接收字符数据(如字符串)

  2. 编码:根据指定编码将字符转为字节序列

  3. 输出:将字节写入底层 OutputStream


五、实战代码模板

1. 写入UTF-8文件

java

try (Writer writer = new OutputStreamWriter(
        new FileOutputStream("output.txt"), StandardCharsets.UTF_8)) {
    writer.write("Hello, 世界!");
    writer.write("\n"); // 换行符
    writer.write(new char[]{'A', 'B', 'C'});
}

2. 与BufferedWriter配合

java

try (BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(
            new FileOutputStream("log.txt"), "GBK"))) {
    bw.write("错误日志1");
    bw.newLine();
    bw.write("错误日志2");
}

3. 获取当前编码

java

OutputStreamWriter osw = new OutputStreamWriter(...);
System.out.println("当前编码: " + osw.getEncoding());

六、编码处理机制

常见编码问题场景

现象原因解决方案
文件打开是乱码写入编码与查看工具编码不一致统一使用UTF-8编码
特殊字符变成?目标编码不支持该字符改用更全面的编码(如UTF-8)
文件大小异常不同编码字符占用字节数不同检查编码一致性

编码指定最佳实践

java

// 推荐方式(Java 7+)
new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);

// 传统方式(注意拼写错误风险)
new OutputStreamWriter(outputStream, "GB18030");

七、记忆心法

1. 三字经记忆法

"桥接器,编字节,转输出"

  • 桥接:连接字符流与字节流

  • 编码:处理字符到字节的转换

  • 转输出:输出字节数据

2. 对比记忆表

对比维度OutputStreamWriterFileWriter
数据目标任何字节流只能写入文件
编码控制可指定任意编码使用系统默认编码
典型用途网络传输/非默认编码写入简单本地文本文件写入

3. 场景联想

想象翻译官:

  • 字符流:母语文本(如中文)

  • OutputStreamWriter:翻译官(按规则编码为目标语言)

  • 字节流:外语字节数据(如UTF-8编码的字节)


八、高频面试题

1. 为什么不直接用FileWriter?

  • FileWriter 缺陷

    • 无法指定编码(用系统默认编码)

    • 跨平台易导致乱码

  • 解决方案

    java

// 永远用OutputStreamWriter替代FileWriter
new OutputStreamWriter(new FileOutputStream(file), "UTF-8");

2. 如何确保编码一致性?

java

// 方案1:全局统一编码常量
public static final Charset APP_CHARSET = StandardCharsets.UTF_8;

// 方案2:配置化读取
Properties props = new Properties();
props.load(configFile);
Charset charset = Charset.forName(props.getProperty("encoding"));

3. 性能优化建议

  • 必须配合缓冲流

    java

    new BufferedWriter(
        new OutputStreamWriter(
            new FileOutputStream("log.txt"), StandardCharsets.UTF_8));

    批量写入:减少flush()调用次数

4. 与PrintWriter的区别?

特性OutputStreamWriterPrintWriter
主要功能字符→字节编码转换格式化输出(print/println)
异常处理抛出IOException吞并异常(checkError())
自动刷新可配置autoFlush

九、终极总结

mermaid

pie
    title OutputStreamWriter核心价值
    "编码控制" : 45
    "流桥接" : 35
    "编码一致性" : 20

黄金法则

"只要涉及文本输出,必须明确指定字符编码!"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LWIP学习笔记

TCP/ip协议结构分层 传输层简记 TCP:可靠性强,有重传机制 UDP:单传机制,不可靠 UDP在ip层分片 TCP在传输层分包 应用层传输层网络层,构成LWIP内核程序: 链路层;由mac内核STM芯片的片上外设…

Nodejs Express框架

参考:Node.js Express 框架 | 菜鸟教程 第一个 Express 框架实例 接下来我们使用 Express 框架来输出 "Hello World"。 以下实例中我们引入了 express 模块,并在客户端发起请求后,响应 "Hello World" 字符串。 创建 e…

Visual Studio Code 开发 树莓派 pico

开发环境 MCU:Pico1(无wifi版)使用固件:自编译版本开发环境:Windows 10开发工具:Visual Studio Code 1.99.2开发语言:MicroPython & C 插件安装 找到Raspberry Pi Pico并安装开启科学上网…

Python与R语言用XGBOOST、NLTK、LASSO、决策树、聚类分析电商平台评论信息数据集

全文链接:https://tecdat.cn/?p41501 分析师:Rui Liu 在当今数字化浪潮席卷的时代,电商市场的蓬勃发展犹如一部波澜壮阔的史诗,蕴藏着无尽的商业价值与潜力。电商平台积累的海量数据,宛如一座等待挖掘的宝藏&#xff…

半导体制造如何数字化转型

半导体制造的数字化转型正通过技术融合与流程重构,推动着这个精密产业的全面革新。全球芯片短缺与工艺复杂度指数级增长的双重压力下,头部企业已构建起四大转型支柱: 1. 数据中枢重构产线生态 台积电的「智慧工厂4.0」部署着30万物联网传感器…

LabVIEW 程序持续优化

LabVIEW 以其独特的图形化编程方式,在工业自动化、测试测量、数据分析等众多领域发挥着关键作用。为了让 LabVIEW 程序始终保持高效、稳定,并契合不断变化的实际需求,持续改进必不可少。下面将从多个关键维度,为大家细致地介绍通用…

Windows10系统RabbitMQ无法访问Web端界面

项目场景: 提示:这里简述项目相关背景: 项目场景: 在一个基于 .NET 的分布式项目中,团队使用 RabbitMQ 作为消息队列中间件,负责模块间的异步通信。开发环境为 Windows 10 系统,开发人员按照官…

初阶数据结构--链式二叉树

二叉树(链式结构) 前面的文章首先介绍了树的相关概念,阐述了树的存储结构是分为顺序结构和链式结构。其中顺序结构存储的方式叫做堆,并且对堆这个数据结构进行了模拟实现,并进行了相关拓展,接下来会针对链…

SpringAI版本更新:向量数据库不可用的解决方案!

Spring AI 前两天(4.10 日)更新了 1.0.0-M7 版本后,原来的 SimpleVectorStore 内存级别的向量数据库就不能用了,Spring AI 将其全部源码删除了。 此时我们就需要一种成本更低的解决方案来解决这个问题,如何解决呢&…

BladeX单点登录与若依框架集成实现

1. 概述 本文档详细介绍了将BladeX认证系统与若依(RuoYi)框架集成的完整实现过程。集成采用OAuth2.0授权码流程,使用户能够通过BladeX账号直接登录若依系统,实现无缝单点登录体验。 2. 系统架构 2.1 总体架构 #mermaid-svg-YxdmBwBtzGqZHMme {font-fa…

JVM 内存调优

内存调优 内存泄漏(Memory Leak)和内存溢出(Memory Overflow)是两种常见的内存管理问题,它们都可能导致程序执行不正常或系统性能下降,但它们的原因和表现有所不同。 内存泄漏 内存泄漏(Memo…

Shell脚本提交Spark任务简单案例

一、IDEA打包SparkETL模块,上传值HDFS的/tqdt/job目录 二、创建ods_ETL.sh脚本 mkdir -p /var/tq/sh/dwd vim /var/tq/sh/dwd/ods_ETL.sh chmod 754 /var/tq/sh/dwd/ods——ETL.sh #脚本内容如下 #!/bin/bash cur_date$(date %Y-%m-%d) /opt/bigdata/spark-3.3.2/b…

国标GB28181视频平台EasyCVR视频汇聚系统,打造别墅居民区智能监控体系

一、现状背景 随着国家经济的快速增长,生活水平逐渐提高,私人别墅在城市、乡镇和农村的普及率也在逐年增加。然而,由于别墅区业主经济条件较好,各类不法事件也日益增多,主要集中在以下几个方面: 1&#x…

BGP分解实验·23——BGP选路原则之路由器标识

在选路原则需要用到Router-ID做选路决策时,其对等体Router-ID较小的路由将被优选;其中,当路由被反射时,包含起源器ID属性时,该属性将代替router-id做比较。 实验拓扑如下: 实验通过调整路由器R1和R2的rout…

【玩泰山派】MISC(杂项)- 使用vscode远程连接泰山派进行开发

文章目录 前言流程1、安装、启动sshd2、配置一下允许root登录3、vscode中配置1、安装remote插件2、登录 **注意** 前言 有时候要在开发板中写一写代码,直接在终端中使用vim这种工具有时候也不是很方便。这里准备使用vscode去通过ssh远程连接泰山派去操作&#xff0…

同步/异步日志系统

同步/异步日志系统 项目演示基础测试性能测试测试环境:同步日志器单线程同步日志器多线程异步日志器单线程异步日志器多线程 工具类(util.hpp)日志等级level.hpp 日志消息message.hpp 日志消息格式化formatter.hpp 日志消息落地sink.hpp 日志…

typescript html input无法输入解决办法

input里加上这个: onkeydown:(e: KeyboardEvent) > {e.stopPropagation();

游戏引擎学习第224天

回顾游戏运行并指出一个明显的图像问题。 回顾一下之前那个算法 我们今天要做一点预加载的处理。上周刚完成了游戏序章部分的所有剪辑内容。在运行这一部分时,如果观察得足够仔细,就会注意到一个问题。虽然因为视频流压缩质量较低,很难清楚…

工厂能耗系统智能化解决方案 —— 安科瑞企业能源管控平台

安科瑞顾强 政策背景与“双碳”战略驱动 2025年《政府工作报告》明确提出“单位国内生产总值能耗降低3%左右”的目标,要求通过产业结构升级(如高耗能行业技术革新或转型)、能源结构优化(提高非化石能源占比)及数字化…

【pytorch图像视觉】lesson17深度视觉应用(上)构建自己的深度视觉项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 数据1、认识经典数据1.1入门数据:MNIST、其他数字与字母识别(1)数据下载(2)查看数据的特征和标…