怎么解决输入流和输出流编码问题?

Java | POST请求,响应中文乱码处理 老生常谈-关于POST请求中文乱码问题 阅读详情

转载自:http://www.360doc.com/content/18/0309/18/42969973_735719881.shtml

在java中读取文件时应该采用什么编码?

Java读取文件的方式总体可以分为两类:按字节读取和按字符读取。

按字节读取

按字节读取就是采用InputStream.read()方法来读取字节,然后保存到一个byte[]数组中,最后经常用new String(byte[]);把字节数组转换成String。在最后一步隐藏了一个编码的细节,new String(byte[]);会使用操作系统默认的字符集来解码字节数组,中文操作系统就是GBK。而我们从输入流里读取的字节很可能就不是GBK编码的,因为从输入流里读取的字节编码取决于被读取的文件自身的编码。举个例子:我们在D:盘新建一个名为demo.txt的文件,写入”我们。”,并保存。此时demo.txt编码是ANSI,中文操作系统下就是GBK。此时我们用输入字节流读取该文件所得到的字节就是使用GBK方式编码的字节。那么我们最终new String(byte[]);时采用平台默认的GBK来编码成String也是没有问题的(字节编码和默认解码一致)。试想一下,如果在保存demo.txt文件时,我们选择UTF-8编码,那么该文件的编码就不在是ANSI了,而变成了UTF-8。仍然采用输入字节流来读取,那么此时读取的字节和上一次就不一样了,这次的字节是UTF-8编码的字节。两次的字节显然不一样,一个很明显的区别就是:GBK每个汉字两个字节,而UTF-8每个汉字三个字节。如何我们最后还使用new String(byte[]);来构造String对象,则会出现乱码,原因很简单,因为构造时采用的默认解码GBK,而我们的字节是UTF-8字节。正确的办法就是使用new String(byte[],”UTF-8”);来构造String对象。此时我们的字节编码和构造使用的解码是一致的,不会出现乱码问题了。

说完字节输入流,再来说说字节输出流。

我们知道如果采用字节输出流把字节输出到某个文件,我们是无法指定生成文件的编码的(假设文件以前不存在),那么生成的文件是什么编码的呢?经过测试发现,其实这取决于写入的字节编码格式。比如以下代码:

OutputStream out = new FileOutputStream("d:\\demo.txt");

out.write("我们".getBytes());

getBytes()会采用操作系统默认的字符集来编码字节,这里就是GBK,所以我们写入demo.txt文件的是GBK编码的字节。那么这个文件的编码就是GBK。如果稍微修改一下程序:out.write(“我们”.getBytes(“UTF-8”));此时我们写入的字节就是UTF-8的,那么demo.txt文件编码就是UTF-8。这里还有一点,如果把”我们”换成123或abc之类的ascii码字符,那么无论是采用getBytes()或者getBytes(“UTF-8”)那么生成的文件都将是GBK编码的。

这里可以总结一下,InputStream中的字节编码取决文件本身的编码,而OutputStream生成文件的编码取决于字节的编码。

下面说说采用字符输入流来读取文件。

首先,我们需要理解一下字符流。其实字符流可以看做是一种包装流,它的底层还是采用字节流来读取字节,然后它使用指定的编码方式将读取字节解码为字符。说起字符流,不得不提的就是InputStreamReader。以下是java api对它的说明: InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。说到这里其实很明白了,InputStreamReader在底层还是采用字节流来读取字节,读取字节后它需要一个编码格式来解码读取的字节,如果我们在构造InputStreamReader没有传入编码方式,那么会采用操作系统默认的GBK来解码读取的字节。还用上面demo.txt的例子,假设demo.txt编码方式为GBK,我们使用如下代码来读取文件:

InputStreamReader  in = new InputStreamReader(new FileInputStream(“demo.txt”));

那么我们读取不会产生乱码,因为文件采用GBK编码,所以读出的字节也是GBK编码的,而InputStreamReader默认采用解码也是GBK。如果把demo.txt编码方式换成UTF-8,那么我们采用这种方式读取就会产生乱码。这是因为字节编码(UTF-8)和我们的解码编码(GBK)造成的。解决办法如下:

InputStreamReader  in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);

给InputStreamReader指定解码编码,这样二者统一就不会出现乱码了。

下面说说字符输出流。

字符输出流的原理和字符输入流的原理一样,也可以看做是包装流,其底层还是采用字节输出流来写文件。只是字符输出流根据指定的编码将字符转换为字节的。字符输出流的主要类是:OutputStreamWriter。Java api解释如下:OutputStreamWriter 是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。说的很明白了,它需要一个编码将写入的字符转换为字节,如果没有指定则采用GBK编码,那么输出的字节都将是GBK编码,生成的文件也是GBK编码的。如果采用以下方式构造OutputStreamWriter:

OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(“dd.txt”),”UTF-8”);

那么写入的字符将被编码为UTF-8的字节,生成的文件也将是UTF-8格式的。

Java高级特性 - IO流 阅读详情

相关推荐

【老生谈算法】可视化通道流中瞬时涡量场的算法实现与MATLAB源码分析——瞬时涡量场

本文旨在探讨可视化通道流中瞬时涡量场的方法,并通过MATLAB编程实现这一过程。涡量场作为描述流体旋涡强度和方向的重要物理量,对于理解复杂流体运动具有重要意义。本文首先介绍了涡量场的基本概念,随后详细阐述了从测量数据收集到涡量场可视化的完整流程,并给出了相应的MATLAB源码。通过实际运行该源码,我们展示了涡量场的可视化结果,并讨论了其在流动结构识别和动力学行为理解中的应用。关键词: 涡量场;流体运动;MATLAB;可视化;PIV一、引言。

m0_53407570的博客 1125

java 通过 InputStream 判断文件编码格式

java 通过 InputStream 判断文件编码格式

AKA石头 2733

openEuler 20.03 LTS面向RK3399移植系列(3)—openEuler 20.03 LTS面向Firefly RK3399的第一个版本(Linux kernel 4.4)

任务动机:完成openEuler面向RK3399开发板的移植。 任务描述:按照固件烧写准备,固件获取,固件打包和烧写的步骤实现openEuler面向RK3399开发板的移植,整理过程和相关命令记录到文档。 1. 制作openEuler的rootfs.img 1.1 开发环境 树莓派--openEuler系统 openEuler 20.03 LTS 的内测版本镜像,下载。 1.2 具体操作 1.2.1 ssh远程连接树莓派 确定树莓派IP ssh连接 1.2.2 制作rootfs.img

火种源码的机器人技术专栏 2369

JAVA判断输入流字符编码的困惑

<br />近日在开发爬虫程序时发现,如果事先不指定正确的字符集编码,在得到InputStream字节流实例后使用程序自身去判断,相关代码如下:<br />if(charset == null || "".equals(charset)) { reader = new InputStreamReader(inputStream); charset = reader.getEncoding(); }else { reader = new InputStreamReader(inputStream

千山独行 2751

离线安装PlutoSDR硬件支持包全攻略:没有MathWorks账号也能搞定MATLAB集成

本文详细介绍了在没有MathWorks账号和网络环境的情况下,如何离线安装PlutoSDR硬件支持包并实现MATLAB集成的完整解决方案。从驱动安装、设备识别到MATLAB支持包的离线部署,提供了全面的步骤指导和常见问题排查方法,特别适合高校实验室、军工单位等内网环境使用。

js777的博客 266

告别路径打架!用Python实现CBS算法搞定仓库机器人调度(附完整代码)

本文详细介绍了如何使用Python实现CBS(Conflict-Based Search)算法解决仓库机器人调度中的路径冲突问题。通过多智能体路径规划(MAPF)技术,有效避免AGV在智能仓库中的碰撞和死锁,提供完整代码实现和工业场景优化技巧,帮助开发者快速构建高效的机器人调度系统。

weixin_30275415的博客 329

Java笔记:字符流Reader/Writer详解

目录0 为什么使用字符流1 字符输入流Reader1.1 FileReader类1.1.1 创建输入流对象1.1.2 读入字符数据2 字符输出流Writer2.1 FileWriter类2.1.1 创建输出流对象2.1.2 写出字符数据关闭和刷新写出其他数据 0 为什么使用字符流 当使用字节流读取文本文件时,可能会有一个小问题。就是当遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。 所以Java提供了字符流类,以字符为单位读写数据,专门用于处理文本文件。 1 字符输入流Re

sc179的博客 2327

利用Arcgis提取nc数据并计算区域年均温

1.下载数据。2.解压数据至不含中文的路径中。打开工具箱中的多维分析工具-创建NetCDF栅格图层,导入数据。3.打开工具箱中的数据管理工具-图层和表视图-创建栅格图层,导入数据,对输出数据进行命名,得到月均温栅格数据。4.选择工具箱-Spatial Analyst工具(空间分析工具)-地图代数-栅格计算器,计算全国一年年均温。​5.将其导出为.tif格式数据,方便后期使用。6.选择工具箱-Spatial Analyst工具(空间分析工具)-区域分析--以表格显示分区统计,得到分区域的气温数据。

什么都学亿点点的博客 7992

java inputstream编码格式_纯文本-FileInputStream的编码与解码方式

前言:以下分析只针对纯文本1.FileInputStream默认的编码方式就是文件的编码方式即:源文件是什么编码方式,则利用FileInputStream默认读取的字节数组,就是什么编码方式。例:纯文本采用“GBK”编码,文本内容如下(注意:文本是纯汉字):你好世界我是潘小白利用“GBK”字符集解码如下:packagecn.edu.uestc.IO;import java.io.*;public ...

weixin_42327291的博客 4156

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

congge 4099

使用 Azure DevSecOps 和 AIOps 构建可扩展且安全的多区域金融科技 SaaS 平台

这家虚构的金融科技 SaaS 组织在 Microsoft Azure 上构建了一个现代化的多区域架构,以实现高可用性、主动安全性和简化的 DevSecOps 工作流。如果您是 DevOps 从业者、SRE 专业人士或致力于创建弹性、可扩展且安全的金融科技解决方案的技术领导者,您将从中获得可直接应用于您自身项目的见解和经验教训。与大多数快速扩张的金融科技公司一样,他们需要确保不间断的正常运行时间、坚不可摧的安全性以及快速的功能交付,以满足全球用户群的需求。即使是短暂的中断也会损害用户的信心和忠诚度。

介绍AWS Azure GCP devops Terraform 等技术 1298

java 输入流编码格式_java获取inputstream输入流是什么编码格式

错误笔记:一开始使用的方法,正常运行没多久,出现一个情况,GBK文件会导致csv文件的第一行第一列乱码,百思不得其解,最终发现是因为在源头,早已使用byte,inputstream。read读取几个字节,所以导致后面的乱码。错误示例如下:文件:12345.csv,格式为GBK主键,密码,创建时间,创建人,修改时间,修改人,是否删除中文,123456,null,null,null,null,fals...

weixin_35924765的博客 1148

从0到1:OpenClaw 助力单元测试代码自动化与覆盖率飞升

OpenClaw 的横空出世,宛如一道曙光,照亮了这片黑暗的领域。它作为一款强大的本地 AI 助手,拥有着令人惊叹的能力。OpenClaw 能够深入理解代码的逻辑结构,自动分析代码中的各种功能和潜在的风险点,从而精准地生成高质量的单元测试代码。它就像是一位不知疲倦的测试专家,能够快速、准确地完成那些繁琐的测试编写工作,将开发者从重复劳动中解放出来,让他们能够将更多的精力投入到更具创造性和价值的工作中。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 477

怎么解决输入流和输出流编码问题

在java中读取文件时应该采用什么编码? Java读取文件的方式总体可以分为两类:按字节读取和按字符读取。按字节读取就是采用InputStream.read()方法来读取字节,然后保存到一个byte[]数组中,最后经常用new String(byte[]);把字节数组转换成String。在最后一步隐藏了一个编码的细节,new String(byte[]);会使用操作系统默认的字符集来

思考、总结、专注 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java 输入流编码格式_[转]怎么解决输入流和输出流编码问题

在java中读取文件时应该采用什么编码?Java读取文件的方式总体可以分为两类:按字节读取和按字符读取。按字节读取就是采用InputStream.read()方法来读取字节,然后保存到一个byte[]数组中,最后经常用new String(byte[]);把字节数组转换成String。在最后一步隐藏了一个编码的细节,new String(byte[]);会使用操作系统默认的字符集来解码字节数组,中...

weixin_33577842的博客 398

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[转]怎么解决输入流和输出流编码问题

[转]怎么解决输入流和输出流编码问题

dearbaba_11的博客 101

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 输入输出流将jsp文件生成html,解决乱码问题

/**   * 生成HTMl文件   */   BufferedReader in = null;   URL url1 = null;   URLConnection urlConn = null;   try {    //http://localhost:8080/pertest/admin.go?method=showReportToCustomer&license=

s20081294的专栏 1180

JavaSe基础XX18——IO流_1

null

雨一直下 1万+

String字符串编码解码格式

https://blog.youkuaiyun.com/qq_35241080/article/details/83001149 //////////////////////////////2 如何识别字符串编码 public static String getEncoding(String str) {              String encode = "GB2312";           ...

studyvcmfc的专栏 606

Java采用HttpURLConnection请求调用服务时中文乱码问题

欢迎使用Markdown编辑器写博客public class HN_cer { /** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param param * 请求参数,请求参数应该是 name1=value1&name2=value

lamb7758的博客 6418

【Java IO流】File文件管理及IO流(基本流)

在电子设备的日常使用中,我们无时不刻在对各个应用的数据进行存储和读取,正因为有了这个技术,对我们的信息存储带来了极大便利。在Java中,IO流就是用于读写文件中的数据(读写文件,或网络中的数据)。而IO流的使用,离不开文件操作,它们间存在密切的联系,通常一起用来实现文件的读取、写入和处理。总之,文件管理提供了对文件系统的操作能力,而I/O流则提供了对文件内容的读取和写入能力,二者结合使用可以实现对文件的全面管理和处理。在Java中,java.io和包提供了丰富的类和方法,支持文件管理和I/O流的操作。

StuLearn-LJC的博客 983

JavaSE--IO流总览06:字符转换输入(输出)流: InputStreamReader ,OutputStreamWrite

学习字符转换流的目的是为了什么?---解决不同编码时字符流读取文本内容乱码的问题---可以控制写出去的字符使用什么字符集编码为什么会有乱码呢?因为读取的文件内容编码与不同导致解读出错为什么要控制字符集编码?为了满足写的文件的编码方式。

weixin_62189092的博客 1110

Java:输入输出转换流

Java:字节输入流、字节输出流当代码编码和文件编码不一致时,读入的文件内容会产生乱码。可以通过转换流来解决。先提取文件的原始字节流,然后用字符输入流转换为需要的编码。代码示例 字符输出转换流 如果需要控制写出去的字符使用的编码,怎么办? 1.可以把字符以指定编码获取字节后再使用字节输出流写出去:“我爱你中国”.getBytes(编码); 2.也可以使用字符输出转换流实现;代码示例...

斯文~ 2213

【字符转换流】概述、使用以及应用场景

如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码。

m0_65462447的博客 264
上一篇: 利用Java的Socket网络编程实现小型聊天室
下一篇: 总结下模拟Tomcat
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值