OutputStreamWriter类getEncoding方法的应用

      今天在写打包程序时,发现了一个及其奇怪的问题,就是OutputStreamWriter.getEncoding()的应用,在官方文

档上解释是这样说的:

返回此流使用的字符编码的名称。

          如果此编码具有历史名称,则返回该名称;否则返回该编码的规范化名称。

          如果此实例是用 OutputStreamWriter(OutputStream, String) 构造方法创建的,则返回的由此编码生成的

惟一名称可能与传递给该构造方法的名称不一样。如果流已经关闭,则此方法可能返回 null。

     (注意红色标记的关键字,就是问题的关键)

   在这里给大家推荐一个高效生成XML的开源项目WAX

(http://www.ociweb.com/mark/programming/WAX.html),生成5000条数据100M左右的XML文件只需要20秒左右

的时间(个人感觉这个效率还是很强的),正是在使用该项目的过程中发现问题。问题描述如下:

 

        //在WAX.java源文件中有如下一段代码
        if (writer instanceof OutputStreamWriter) {
                encoding = ((OutputStreamWriter) writer).getEncoding();
            }

 

  而我在构造OutputStreamWriter对象时采用的是 OutputStreamWriter(OutputStream, String) 构造方法,传

递的字符编码是“UTF-8”,但是,通过OutputStreamWriter.getEncoding()返回的却是“UTF8”,这样,通过WAX

生成XML文件的XML declaration部分的encoding就变成了UTF8,导致生成的XML文件其它解析器无法解析。将

上面的一段源码进行修改如下:

      if (writer instanceof OutputStreamWriter) {
            //encoding = ((OutputStreamWriter) writer).getEncoding();
            //pengfeng modify
            encoding = Charset.forName(((OutputStreamWriter) writer).getEncoding()).name();
        }

    OK,一切问题解决!

    呵呵,上面只说了问题的解决办法,该办法主要来源于http://jira.codehaus.org/browse/WSTX-146,引用如下:

 

   The code in the attached unit test incorrectly creates a document with an encoding in the XML
declaration of 'UTF8'. According to section 4.3.3 of the XML 1.0 spec, all XML parsers must support
encoding 'UTF-8', but not 'UTF8'. So many parsers including Xerces, won't parse that document.

The problem appears to be caused by the following code in WstxOutputFactory:

 

// we may still be able to figure out the encoding:
            if (enc == null) {
                if (w instanceof OutputStreamWriter) {
                    enc = ((OutputStreamWriter) w).getEncoding();
                }
            }

   According to the Javadoc for OutputStreamWriter.getEncoding(), "If the encoding has an historical

name then that name is returned; otherwise the encoding's canonical name is returned." The historical

name for UTF-8 is UTF8.

I believe the correct code would be:

// we may still be able to figure out the encoding:
            if (enc == null) {
                if (w instanceof OutputStreamWriter) {
                    enc = Charset.forName(((OutputStreamWriter) w).getEncoding()).name();
                }
            }

Tatu Saloranta added a comment - 18/Mar/08 02:09 PM
Thanks! This does indeeed look like sub-optimal behavior. As a work-around, applications shouldn't
rely on auto-detection of the encoding, but I definitely want to improve this auto-detection as well.

One minor note: since Charset class was introduced in JDK 1.4, the fix as suggested can only be added

to Woodstox 4.0. For 3.2, if the fix is to be backported I could just add specific work-around for UTF-8,

since that is likely to be the most common case (additionally if others are identified they can be added

of course).

I will fix this shortly for trunk (4.0).

 

Tatu Saloranta added a comment - 26/Mar/08 12:57 PM
Easy to fix, will call Charset.normalize() for the value (which already knows many legacy conversions).
I think I'll also backport it to 3.2.x, since there's no API change and this should be a safe fix.
MCP详解:手把手教你理解和如何使用各种开源MCP服务 MCP 作为一种开放协议,为 AI 模型与外部世界的连接提供了标准化的解决方案。它不仅降低了开发门槛,还极大地扩展了 AI 应用的边界。无论是开发者还是普通用户,都可以通过 MCP 更高效地利用 AI 技术,实现更多智能化的功能。 阅读详情

相关推荐

安卓手机必备:Auto.js快手极速版自动刷视频避坑指南(含最新3.0脚本)

本文是一份安卓自动化工具Auto.js的全面实践指南,重点解析了如何搭建稳定运行环境、配置关键权限以及管理脚本。针对快手极速版等应用的自动化需求,文章详细介绍了设备选择、Auto.js版本对比、各品牌手机后台保活设置,并强调了脚本安全与调试技巧,帮助用户有效避坑,实现自动化任务的稳定执行。

i7j8k9l的博客 782

JAVA基础知识之OutputStreamWriter流

一、OutputStreamWriter流     API说明:OutputStreamWriter是从字符流到字节流的桥接:使用指定的字符集将写入其中的字符编码为字节。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。 每次调用write()方法都会导致在给定字符上调用编码转换器。生成的字节在写入底层输出流之前在缓冲区中累积。可以指定此缓冲区的大小,但默认情况下,它...

咕噜是个胖子 5万+

利用LTspice设计Pt100测温电路

是一种广泛使用的温度传感器,它属于(RTD, Resistance Temperature Detector)的类型,通常用于温度测量。在0°C时,的电阻值为100欧姆,且它的电阻值会随着温度的升高而升高。PT100热电阻温度阻值对应表)因此可以根据这一特性来检测出环境温度。

2301_77033628的博客 2412

Java IO 学习总结(五)OutputStreamWriter

学习IO流,记录并分享。文章如有错误,恳请指正。OutputStreamWriter是字符通向字节流的桥梁:可以指定的charset将要写入流中的字符编码成字节。(编码:能看懂的字符变为看不懂的字节),关于java当中转换流,OutputStreamWriter的使用,主要是通过指定的编码表名称,来查询相对应的编码表,将字符编码为字节存储到缓冲区,再使用flush方法将内存中的文件刷新带文件中。

uziuzi669的博客 1万+

STM32F105双路CAN通讯无法进入接收中断问题及解决方法

STM32F105RBT6双路CAN通讯无法进入接收中断问题及解决方法

m0_62383223的博客 3441

【思博伦】史上最详细Spirent TestCenter测试仪使用教程精讲(一)!图解超赞超详细!!!

3. 在弹出的界面中,找到菜单栏中的“Connect/Create”,选择下拉框中的“Connect to Physical/Visual Chassis”,在弹出的对话框中输入思博伦测试仪的IP地址:192.168.6.244,点击“OK”;说明:目前我们只需要使用到Raw Stream Block,不需要用到Bound Stream Block。说明:如果要使用100G模式,由于硬件限制,必须连续3个面板端口同时配置为100G使用。打开安装包,并按照提示按照即可。

风云说通信 6477

IO流(学习Java第24天)(转换流OutputStreamWriter、转换流InputStreamReader、字符流便捷类)

目录 一、转换流OutputStreamWriter 二.转换流InputStreamReader 三.字符流便捷类 一、转换流OutputStreamWriter java.io.OutputStreamwriter类,继承Writer类,他是字符输出流,只能操作文本文件,不能操作其他类型文件。OutputStreamwriter是字符流通向字节流的桥梁(字符流转成字节流),使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。 OutputStrea

weixin_42279465的博客 1949

SolidWorks 小车底盘 装配体

通过制作小车底盘了解solidworks装配体的部分知识

及时总结 2226

JAVA转换流

OutputStreamWriter import java.io.*; /* java.io.OutputStreamWriter extends Writer OutputStreamWriter:是字符流通向字节流的桥梁;可使用指定的charset将要写入流中的字符编码成字节。 构造方法: OutputStreamWriter(OutputStre...

qq_41870790的博客 446

Scratch全攻略:从入门到实践的编程之旅

Scratch 是一款由麻省理工学院(MIT)开发的图形化编程工具 ,它诞生的初衷是为了让编程教育更加普及,尤其是让孩子们能够轻松接触和学习编程。与传统的基于文本代码的编程方式不同,Scratch 通过将编程指令以图形化的积木形式呈现,极大地降低了编程的门槛,让编程变得如同搭积木一样简单有趣。

邓邓子的博客 1万+

工业级4~20mA转0~3V信号调理电路原理图设计,已量产(电流传感器)

在工业现场,4~20mA 电流信号是模拟量传输的 “老熟人”—— 抗干扰强、能跑长距离,但嵌入式 MCU 的 ADC 一般只认电压信号。最近做项目时,我设计了一款能覆盖 0~25mA(含超量程冗余)、线性输出 0~3V 的调理电路,经过现场调试挺稳定,分享下细节。

不脱发的程序猿 525

Java OutputStreamWriter getEncoding()方法与示例

OutputStreamWriter类的getEncoding()方法 (OutputStreamWriter Class getEncoding() method) getEncoding() method is available in java.io package. getEncoding()方法在java.io包中可用。 getEncoding() method is used to ...

cumtv80668的专栏 2528

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

streamwriter java_Java OutputStreamWriter 类

Java OutputStreamWriter 类在本教程中,我们将借助示例学习Java OutputStreamWriter及其方法。java.io包的OutputStreamWriter类可用于将字符形式的数据转换为字节形式的数据。它继承了抽象类Writer。OutputStreamWriter类可与其他输出流一起使用。 它也被称为字节流和字符流之间的桥梁。 这是因为OutputStreamW...

weixin_34285757的博客 1688

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java io OutputStreamWriter源码分析

简介 package java.io; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import sun.nio.cs.StreamEncoder; /** * OutputStreamWriter是一个从字符流到字节流的桥梁: * 写入到它的字符使用指定的Charset成为字节。 * 它使用的字符集可以通过名称指定或明确给出,也可以接受平台的默认字符集。 * * <p> 对

今天吃了吗的博客 361

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

InputStreamReader类和OutputStreamWriter类学习笔记

 一、InputStreamReader类1、java.lang.Object  java.io.Reader      java.io.InputStreamReader 所有已实现的接口: Closeable, Readable 直接已知子类: FileReader 2、public class InputStreamReader extends Reader InputStrea

my_dream_fly的专栏 2597

java使用Encoding导什么包_String getEncoding()

String getEncoding()描述 (Description)java.io.OutputStreamWriter.getEncoding()方法返回此流使用的字符编码的名称。如果编码具有历史名称,则返回该名称; 否则返回编码的规范名称。如果使用OutputStreamWriter(OutputStream,String)构造函数创建此实例,则返回的名称(对于编码而言是唯一的)可能与传...

weixin_39599372的博客 739

java InputSreamReader类、OutputStreamWriter类

InputStreamReader类是从字节流到字符流的桥接器,它使用指定的字符集读取字节并将它们解码为字符。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。为了实现字节到字符的有效转换,可以从基础流中提取比满足当前读取操作所需的更多字节。为了获得最高效率,请考虑在BufferedReader中包装InputStreamReader。......

weixin_49346755的博客 667

java filewriter 编码_Java FileWriter 类

Java FileWriter 类在本教程中,我们将借助示例学习Java FileWriter及其方法。java.io包的FileWriter类可用于将数据(以字符为单位)写入文件。它继承了OutputStreamWriter类。在进一步了解FileWriter之前,请确保了解Java文件。创建一个FileWriter为了创建文件写入器,我们必须首先导入Java.io.FileWriter包。导入...

weixin_42519161的博客 2407

Java中转换流类的使用

功能:指定文件编码格式的字符输出流类,用于将指定格式的数据写入文件,类名为:OutputStreamWriter。 使用步骤: 1、创建字节输出流对象(例如:FileOutputStream类对象),构造方法中传递需要写入的文件或者文件路径。 2、创建转换输出流类,即OutputStreamWriter类对象,构造方法中传递字节输出流对象和编码格式。注意:编码格式省略时默认使用便于器 的编码格式,例如:现在idea使用UTF-8编码,则默认为UTF-8编码。 3、调用转换输出流类对象的write方法写入数据

wopoli的博客 1875

Java8 I/O源码-InputStreamReader与OutputStreamWriter

InputStreamReader,字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符。 OutputStreamWriter,字符流通向字节流的桥梁:它使用指定的charset将要写入流中的字符编码成字节。

潘威威的博客 1237

Java中IO框架——InputStreamReader/OutputStreamWriter源码解析

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。 InputSt

在梅边的专栏 328

Java 转换流

开发工具与关键技术:Java 、MyEclipse 作者:邹赛 撰写时间:2019/4/16 Java IO流中提供了两种用于将字节流转换为字符流的转换流。其中InputStreamReader用于将字节输入流转换为字符输入流,其中OutputStreamWriter用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集 1、OutputStream...

博客 1万+

java写入文件编码格式为ansi_java中怎么获取、设置文件编码格式?

public class OutputStreamWriterTest {public static void main(String[] args) {try {OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("e:\\test.txt"));osw.write("学海无涯,维勤是岸!!!");System...

weixin_30082413的博客 2315

IO流学习6

本节我们学习转换流,输入转换流,输出转换流注意转换流只能字节转字符,不能字符转字节特别提醒:最后不要忘记关流 close()

破包装代码的博客 184

80-Java FileWriter 类

本文介绍了Java中的FileWriter类及其使用方法。FileWriter类位于java.io包中,用于将字符数据写入文件,继承自OutputStreamWriter类。文章详细说明了创建FileWriter的两种方式:通过文件名或文件对象,并提到从Java 11开始可以指定字符编码(如UTF8或UTF16)。主要方法包括write()系列方法用于写入数据、getEncoding()获取编码类型、close()关闭写入器以及flush()和append()等辅助方法。最后通过代码示例演示了如何将字符串写

专注分享原创技术干货。大厂资深架构师,多年技术架构与技术管理经验,多年面试官经验。一对一技术指导培训,带你从小白到入门到架构设计到技术管理。关注我,免费领取学习资料。一对一免费面试指导,快速拿offer。 284

Java之转换流

转换流也是处理流的一种,分为OutputStreamWriter、InputStreamReader两种,是将字节流转化为字符流进行读取或者写入。 public class TestTransForm1 { public static void main(String[] args) { try { //将OutputStream转换成Writer Outpu

Hello_zihan的博客 342
上一篇: oracle管道化表函数
下一篇: apache的开源连接池 - BasicDataSource问题
javaRwx
博客等级 码龄20年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值