Java流处理之转换编码的转换流

之前的博客梳理了基本的字节流和字符流:Java字节流和字符流详解,本文主要讲基于基础的字节字符流做转换编码的转换流。

文章目录

    • 🤦‍♂️字符编码和字符集
      • 🏃字符编码
      • 🏃‍♀️字符集
    • ⛹编码引出的问题
    • 🏋InputStreamReader类
      • 🚴构造方法
      • 🤾指定编码读取
    • 🛀OutputStreamWriter类
      • 👫构造方法
      • 🏊指定编码写出
      • 🏄‍♂️转换流理解图解
    • ⛷️转换文件编码案例
      • 🚣‍♂️案例分析
      • 🤽‍♂️案例实现

🤦‍♂️字符编码和字符集

🏃字符编码

计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。
编码:字符(能看懂的)–字节(看不懂的)
解码:字节(看不懂的)–>字符(能看懂的)

  • 字符编码Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。
    编码表:生活中文字和计算机中二进制的对应规则

🏃‍♀️字符集

  • 字符集Charset:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。

计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBK字符集、Unicode字符集等。编码与解码
可见,当指定了编码,它所对应的字符集自然就指定了,所以编码才是我们最终要关心的。

  • ASCII字符集
    • ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
    • 基本的ASCII字符集,使用7位(bits)表示一个字符,共128字符。ASCII的扩展字符集使用8位(bits)表示一个字符,共256字符,方便支持欧洲常用字符。
  • ISO-8859-1字符集
    • 拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。
    • ISO-8859-1使用单字节编码,兼容ASCII编码。
  • GBxxx字符集
    • GB就是国标的意思,是为了显示中文而设计的一套字符集。
    • GB2312:简体中文码表。一个小于127的字符的意义与原来相同。但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
    • GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。
    • GB18030:最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。
  • Unicode字符集
    • Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。
    • 它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF-32。最为常用的UTF-8编码。
    • UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。所以,我们开发Web应用,也要使用UTF-8编码。它使用一至四个字节为每个字符编码,编码规则:
      1. 128个US-ASCII字符,只需一个字节编码。
      2. 拉丁文等字符,需要二个字节编码。
      3. 大部分常用字(含中文),使用三个字节编码。
      4. 其他极少使用的Unicode辅助字符,使用四字节编码。

⛹编码引出的问题

在IDEA中,使用FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。

public class ReaderDemo {public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("E:\\File_GBK.txt");int read;while ((read = fileReader.read()) != -1) {System.out.print((char)read);}fileReader.close();}
}
输出结果:
���

那么如何读取GBK编码的文件呢?🧐

🏋InputStreamReader类

转换流java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

🚴构造方法

  • InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流。
  • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流。

构造举例,代码如下:

InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");

🤾指定编码读取

public class ReaderDemo2 {public static void main(String[] args) throws IOException {// 定义文件路径,文件为gbk编码String FileName = "E:\\file_gbk.txt";// 创建流对象,默认UTF8编码InputStreamReader isr = new InputStreamReader(new FileInputStream(FileName));// 创建流对象,指定GBK编码InputStreamReader isr2 = new InputStreamReader(new FileInputStream(FileName) , "GBK");// 定义变量,保存字符int read;// 使用默认编码字符流读取,乱码while ((read = isr.read()) != -1) {System.out.print((char)read); // ��Һ�}isr.close();// 使用指定编码字符流读取,正常解析while ((read = isr2.read()) != -1) {System.out.print((char)read);// 大家好}isr2.close();}
}

🛀OutputStreamWriter类

转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

👫构造方法

  • OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流。
  • OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流。

构造举例,代码如下:

OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");

🏊指定编码写出

public class OutputDemo {public static void main(String[] args) throws IOException {// 定义文件路径String FileName = "E:\\out.txt";// 创建流对象,默认UTF8编码OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(FileName));// 写出数据osw.write("你好"); // 保存为6个字节osw.close();// 定义文件路径String FileName2 = "E:\\out2.txt";// 创建流对象,指定GBK编码OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(FileName2),"GBK");// 写出数据osw2.write("你好");// 保存为4个字节osw2.close();}
}

🏄‍♂️转换流理解图解

转换流是字节与字符间的桥梁!
字节与字符转换

⛷️转换文件编码案例

将GBK编码的文本文件,转换为UTF-8编码的文本文件。

🚣‍♂️案例分析

  1. 指定GBK编码的转换流,读取文本文件。
  2. 使用UTF-8编码的转换流,写出文本文件。

🤽‍♂️案例实现

public class TransDemo {public static void main(String[] args) {      // 1.定义文件路径String srcFile = "file_gbk.txt";String destFile = "file_utf8.txt";// 2.创建流对象// 2.1 转换输入流,指定GBK编码InputStreamReader isr = new InputStreamReader(new FileInputStream(srcFile) , "GBK");// 2.2 转换输出流,默认utf8编码OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(destFile));// 3.读写数据// 3.1 定义数组char[] cbuf = new char[1024];// 3.2 定义长度int len;// 3.3 循环读取while ((len = isr.read(cbuf))!=-1) {// 循环写出osw.write(cbuf,0,len);}// 4.释放资源osw.close();isr.close();}
}

相关文章:
Java流处理之高效读写的缓冲流
Java流处理之序列化和打印流
File类详解(获取文件名称、大小、路径、创建等)

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

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

相关文章

C语言【隐式类型转换】和【显式类型转换】的详解

本期介绍🍖 主要介绍:那些不被轻易发现的类型转换,隐式类型转换和显示类型转换👀。 文章目录 一、前言🍖二、隐式类型转换🍖2.1 整形提升🍖2.1.1 例题1🍖2.1.2 例题2🍖2.…

基本数据类型的转换 (基础完整篇)

基本数据类型间的转换包括 自动类型转换 和 强制类型转换 ,本文还讲了基本数据类型和String类型间的转换,这些是学习的重点,掌握这些之后还有其他想法或疑问,都可以自己尝试用代码验证结果,总之多实践比死记硬背更有用。&#x1f…

真正的GHOXPGHOST纯净版“觉山孤鹤GHOSTXP纯净版”五一奉献

真正的GHOXPGHOST纯净版“觉山孤鹤GHOSTXP纯净版”五一奉献 描述:一、光盘DOS下启动图 图片: 描述:二、安装效果图 图片: 描述:三、进入桌面 图片: 描述:四、光盘WIN下启动图 图片: …

木蚂蚁软件光盘 V2.0 2008元旦贺岁版

木蚂蚁软件光盘 V2.0 2008元旦贺岁版木蚂蚁软件光盘 V2.0 ★2008元旦贺岁★『木蚂蚁wuhanqi出品--->装机必备』 软件大小:719MB软件类别:国产软件/系统工具软件性质:木蚂蚁wuhanqi特别版 软件授权:免费版 软件语言&#xff1a…

数据结构--队列与循环队列

队列 队列是什么,先联想一下队,排队先来的人排前面先出,后来的人排后面后出;队列的性质也一样,先进队列的数据先出,后进队列的后出;就像图一的样子: 图1 如图1,1号元素是…

【Flutter】Flutter 使用 toggle_switch 实现切换按钮

【Flutter】Flutter 使用 toggle_switch 实现切换按钮 文章目录 一、前言二、安装和基本使用三、Toggle Switch 的基础示例四、Toggle Switch 的高级用法五、实际业务中的完整示例六、总结 一、前言 你好,我是小雨青年,今天我要为大家介绍一个非常实用的…

node.js安装好后测试报错解决

node.js的版本是18.X.X node.js安装好后,执行命令: npm install express -g 报错!!! 解决办法: 看报错是由于权限不够, 所以打开cmd时,以管理员的方式打开 然后再执行命令就OK了…

dataframe更改数据的方法(超级简单易懂!!!)

::::插入数据 import pandas as pd import numpy as npdfpd.DataFrame(data[[zs,18,1],[ls,19,1],[ww,17,2]],index[stu0,stu1,stu2],columns[name,age,group]) df 更改单个数据的方法 取出数据后直接赋值(一般用不到…

怎样把PDF转换成WORD简单有效

其实文件格式转换的方法大同小异。无非就是选择格式,添加文件,开始转换,但是就这简单的几步,操作不好也会造成转换失败,下面小编以最常见的pdf转换成word格式为例,给大家详细说说pdf转换成word需要注意的地…

如何將人臉變漂亮(一)

利用 mediapipe 進行處理 規劃 1.先把人臉辨識,然後取出框框 2.把框框內的人臉,進行美容 -高反差保留 (1)曝光度調整 (2)綠色與藍色,疊加 (3)YUCIHighPassSkinSmoothingMaskBoost -調整圖像亮度 -混合 3.把人臉的嘴巴,進行塗紅 4.…

pdf转word文档怎么转?看完这篇你就会了

随着数字化时代的到来,电子文档的使用越来越普遍。无论是在学校里撰写论文、在公司里编辑报告,还是在日常生活中收到合同或简历,我们都可能遇到需要将pdf文件转换为word格式的情况。这时,一款高效且易用的pdf转word软件便成为我们…

那种单眼皮小眼睛塌鼻梁厚嘴唇但还挺好看的女生

那种单眼皮小眼睛塌鼻梁厚嘴唇但还挺好看的女生 Data Dance Data Dance大数据采集分析软件,大数据技术经典算法 只有不符合大众审美的人,所以每个人都是美的!你们通过这篇文章认识了照片上的我,但如果你们在现实生活中见到我&…

pdf如何转换成word格式最简单

当我们遇到难题的时候,应该积极地寻找方法去解决问题,特别是工作中,只有遇到问题解决问题才能更好的完成工作,拿文件转换问题来说,遇到难转换的文件格式,我们只要积极寻找解决方法还是可以轻松完成转换的。…

pdf怎么转换成word 文档?这几个小妙招别错过

pdf怎么转换成word 文档?想必大家都经常遇到这样的问题:在网上下载了一个 pdf 文件,但是突然需要对其中的文字进行编辑,但是 pdf 文件却不支持直接编辑,这时就需要将 pdf 文件转换成 word 文档,进行编辑。下…

pdf转word文档怎么转?手把手教你转换

随着数字化时代的到来,电子文档在我们的生活和工作中扮演着越来越重要的角色。尤其是pdf格式的文件,由于其可靠性和跨平台的特性,成为了广泛使用的标准文档格式之一。然而,当我们需要对pdf文件进行编辑时,尤其是将其转…

Pandas Dataframe Drop函数的用法

Pandas Dataframe Drop函数的用法 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html

怎么把照片变年轻?这两个照片变年轻小妙招教给你

怎么把照片变年轻呢?随着年龄的增长,许多人会感到自己不再年轻,失去了曾经的美貌和活力。通过将照片变年轻,你可以重新体验过去的感觉,回忆起年轻时的美好时光,仿佛回到了过去,让我们感受到那段…

单眼皮眼妆学起来 打造电眼只需六步

很多内双或者单眼皮的MM们都很不自信,觉得自己的眼睛长得不够好看,对于单眼皮怎么画眼线一无所知,所以就不愿意化妆,而且就算化妆也得贴个双眼皮贴,看起来很不自然。其实不一定,现在国际上都爱单眼皮呢!今天&#xff0…

单眼皮比双眼皮高等?

郑昀 20091012 看到一条 玩聚RT 上榜消息:“ RT lookon RT Klaith: 交大医学院的某主任教授曾经和我们吹牛,说单眼皮的人比双眼皮的高等,因为除人以外的动物都只有双眼皮。22次锐推 | 最早发布于2009-10-11 ”。 果真如此? 1、狗…

Docker网络-探索容器网络如何相互通信

当今世界,企业热衷于容器化,这需要强大的网络技能来正确配置容器架构,因此引入了 Docker Networking 的概念。Docker 是一种容器化平台,允许您在独立、轻量级的容器中运行应用程序和服务。Docker 提供了一套强大的网络功能&#x…