Java学习笔记31——字符流

字符流

  • 字符流
    • 为什么出现字符流
    • 编码表
    • 字符串中的编码解码问题
    • 字符流写数据的5中方式
    • 字符流读数据的两种方式
    • 字符流复制Java文件

字符流

为什么出现字符流

汉字的存储如果是GBK编码占用2个字节,如果是UTF-8占用三个字节

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,识别的方法是:
汉字在编码时,不论是那种编码方式,第一个字节都是负数

由于字节流操作中文不是特别的方便,所以Java提供字符流

字符流=字节流+编码表

编码表

计算机中储存的信息都是二进制数表示的,从屏幕上看到的都是二进制数转换后的结果

编码:按照某种规则将字符存在计算机中
解码:将储存在计算机中的二进制数按照某种规则解析

  1. ASCII字符集:**用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)
    **
    基本的ASCII字符集用7位表示,总共128个字符
    拓展的用8位,共256个字符,方便支持欧洲常用字符

  2. GBXXX字符集:
    a. GB2312:简体中文码表。一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名等都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字书长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了
    b. GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及曰韩汉字等
    c. GB18030∶最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,筒时支持繁体汉字以及日韩汉字等

  3. Unicode字符集:为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF32。最为常用的UTF-8编码。
    **UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码
    **
    编码规则
    a. 128个US-ASCIl字符,只需一个字节编码拉丁文等字符,需要二个字书编码
    b. 大部分常用字(含中文),使用三个字节编码
    c. 其他极少使用的Unicode辅助字符,使用四字节编码

**采用何种规则编码,就要采用对应规则解码,否则就会出现乱码
**

字符串中的编码解码问题

编码

  • byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
  • byte[] getBytes(String charsetName):使用自动的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

解码

  • String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
  • String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String

用GBK编码,utf-8解码乱码

public class StringDemo {public static void main(String[] args) throws UnsupportedEncodingException {String s="中国";
//        byte[] bys=s.getBytes();//[-28, -72, -83, -27, -101, -67]
//        byte[] bys=s.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]byte[] bys=s.getBytes("GBK");//[-42, -48, -71, -6]String ss=new String(bys);System.out.println(ss);String sss=new String(bys,"GBK");System.out.println(sss);}
}

用同样的方式编解码,正常

字符流写数据的5中方式

方法名说明
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)写入字符串的一部分

字符流读数据的两种方式

方法名说明
int read()一次读一个字符
int read(char[], cbuf)一次读一个字符数组数据

字符流复制Java文件


public class CopyJavaDemo01 {public static void main(String[] args) throws IOException {//创建字符输入流对象InputStreamReader isr= new InputStreamReader(new FileInputStream("test.java"));OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("Copy.java"));
//     读写复制
//      一次读一个字符数据int ch;while((ch=isr.read())!=-1){osw.write(ch);}
//      一次读写一个字符数组char[] chs=new char[1024];int len;while ((len=isr.read(chs))!=-1){osw.write(chs,0,len);}
//      释放资源isr.close();osw.close();}
}

转换流的名字比较长,常见操作都是按照本地默认编码实现,为了简化书写,转换流提供了对应的子类

FileReader继承自InputStreamReader,读取字符文件的便捷类

FileWriter继承自OutputStreamWriter,读取字符文件的便捷类

public class CopyJavaDemo02 {public static void main(String[] args) throws IOException {FileReader fr=new FileReader("test.java");FileWriter fw=new FileWriter("copy02.java");int ch;while ((ch= fr.read())!=-1){fw.write(ch);}fr.close();fw.close();}
}

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

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

相关文章

驱动开发错误汇编

本博文将会不定期更新。以便记录我的驱动开发生涯中的一些点点滴滴的技术细节和琐事。 生成时link找不到导出函数,比如"LNK2019 无法解析的外部符号 _FltCreateCommunicationPort32"。出现这种情况的原因是,驱动的编译环境忽略了所有的默认库&…

基于实例的学习方法

基于实例的学习方法 动机基本概念基于实例的学习基于实例的概念表示 1. 最近邻最近邻的例子理论结果最近邻(1- NN):解释问题 K-近邻(KNN)KNN讨论1 :距离度量KNN 讨论2:属性KNN:属性归一化KNN:属性加权 KNN讨论3:连续取值目标函数K…

C# 使用NPOI操作EXCEL

1.添加NOPI 引用->管理NuGet程序包->添加NOPI 2.相关程序集 3.添加命名空间 using NPOI.HSSF; using NPOI.XSSF; using System.IO; using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; 4.从Excel导入的dgv样例 //NPOI读入dgv private void button1_Click(object s…

Python切换输入法的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

经纬恒润荣获吉利汽车“最佳价值贡献”奖

8月18日,以“全面向新 共创共赢”为主题,吉利汽车在宁波成功举行2023年电子电器核心供应商恳谈会。经纬恒润凭借在项目合作上持续创新、高效协同等优异表现,获得“最佳价值贡献”奖项。 作为国产汽车代表性品牌之一,吉利汽车积极推…

多通道振弦数据记录仪在岩土工程隧洞中的完整解决方案

多通道振弦数据记录仪在岩土工程隧洞中的完整解决方案 隧洞工程是一种非常复杂的工程类型,需要高度的安全性和精确性。而在岩土工程中,振弦是一种非常常用的测试方法,用于测定岩土体的物理性质以及地震波传播特性等,以利于对隧洞…

【深入浅出设计模式--状态模式】

深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景 状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧密相关&#x…

解决Three.js辉光背景不透明

使用此pass canvas元素的background都能看到 不过相应的辉光颜色和背景颜色不相容的地方看起来颜色会怪一些 如图 不过如果是纯色就没什么问题了 //ts-nocheck /** Author: hongbin* Date: 2023-04-06 11:44:14* LastEditors: hongbin* LastEditTime: 2023-04-06 11:49:23* De…

电缆工厂 3D 可视化管控系统 | 智慧工厂

近年来,我国各类器材制造业已经开始向数字化生产转型,使得生产流程变得更加精准高效。通过应用智能设备、物联网和大数据分析等技术,企业可以更好地监控生产线上的运行和质量情况,及时发现和解决问题,从而提高生产效率…

libevent源码学习3---事件event

libevent源码学习3—事件event libevent 的基本操作单元是事件。每个事件代表一组条件的集合, 这些条件包括: 文件描述符已经就绪, 可以读取或者写入文件描述符变为就绪状态,可以读取或者写入(仅对于边沿触发 IO)超时事件发生某信号用户触发事件 所有事件具有相似的生命周期。…

深度学习推荐系统(二)Deep Crossing及其在Criteo数据集上的应用

深度学习推荐系统(二)Deep Crossing及其在Criteo数据集上的应用 在2016年, 随着微软的Deep Crossing, 谷歌的Wide&Deep以及FNN、PNN等一大批优秀的深度学习模型被提出, 推荐系统全面进入了深度学习时代, 时至今日&#xff0c…

跨站请求伪造(CSRF)

文章目录 渗透测试漏洞原理跨站请求伪造(CSRF)1. CSRF概述1.1 基本概念1.1.1 关键点1.1.2 目标 1.2 CSRF场景1.2.1 银行账户转账1.2.2 构造虚假网站1.2.3 场景建模1.2.4 实验 1.3 CSRF类别1.3.1 POST方式 1.4 CSRF验证1.4.1 CSRF Poc generator 1.5 XSS与…

SpringAOP详解(下)

proxyFactory代理对象创建方式和代理对象调用方法过程: springaop创建动态代理对象和代理对象调用方法过程: 一、TargetSource的使用 Lazy注解,当加在属性上时,会产生一个代理对象赋值给这个属性,产生代理对象的代码为…

政府科技项目验收全流程分享

科技验收测试 (验收申请→主管部门初审→科技厅审核→组织验收→归档备案→信用管理): (一)验收申请 项目承担单位通过省科技业务管理系统提交验收申请。 按期完成的项目,项目承担单位应当在项目合同书…

C 实现Window/DOS 键盘监听事件

今天是重新复习C语言实现的第一天,今天想编写C 对Windwos/Dos 键盘事件的学习。但是我在安装Visual Studio 2022 没有安装MFC 框架,今天记录下VS追加 MFC框架。 Visual Studio 2022 追加MFC 1、打开vs,点击创建新项目,右侧滑动框…

docker 学习-- 04 实践2 (lnpmr环境)

docker 学习 系列文章目录 docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 docker 学习-- 03 环境安装 docker 学习-- 04 实践 1(宝塔) docker 学习-- 04 实践 2 (lnpmr环境) 文章目录 docker 学习 系列文章目录1. 配…

5G智能网关如何解决城市停车痛点难点

2023年上半年,我国汽车新注册登记1175万辆,同比增长5.8%,88个城市汽车保有量超过100万辆,北京、成都等24个城市超过300万辆。随着车辆保有量持续增加,停车难问题长期困扰城市居民,也导致城市路段违停普遍、…

制作鲜花商城小程序的详细步骤

如果你是一个新手商家,想要进入鲜花团购市场,但是不知道如何制作一个小程序商城,那么这篇文章就是为你准备的。以下是制作鲜花团购小程序商城的详细步骤: 1. 登录乔拓云平台后台,进入商城管理页面 首先,你需…

虚拟化技术:云计算发展的核心驱动力

文章目录 虚拟化技术的概念和作用虚拟化技术的优势虚拟化技术对未来发展的影响结论 🎉欢迎来到AIGC人工智能专栏~虚拟化技术:云计算发展的核心驱动力 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客🎈该系…

WebGL矩阵变换库

目录 矩阵变换库: Matrix4对象所支持的方法和属性如表所示: 方法属性规范: 虽然平移、旋转、缩放等变换操作都可以用一个44的矩阵表示,但是在写WebGL程序的时候,手动计算每个矩阵很耗费时间。为了简化编程&#xf…