java:字符集和字符流

字符集

规定了字符和二进制之间对应关系的一张表

字节是计算机最基本的存储单位

字符则是通过字符组成和编码而成的文本

常见字符集

1,ASCII字符集

基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号

一个字节表示一个字符

所有的字符集均兼容ASCII字符集

2,GBK国标码

对ASCII字符集进行了扩展,

汉字使用两个字节来表示一个字符,英文数字占一个字节

,可以表示更多的字符范围,包括汉字和其他的特殊符号共2w多字符,可以满足大部分中文字符的需求.但无法在全球范围使用

3,Unicode全球字符编码标准

包含所有已知字符,包括各种语言的字符符号和图形,可以根据字符的范围使用不同长度的字节,实现高效的存储和传输,

UTF-8编码三个字节表示一个字符,英文数字占一个字节

编码和解码

编码:把字符按照指定字符集编码为字节

解码:把字节按照指定字符集解码为字符

String类中提供了相应方法来实现编码和解码

编码:把字符串按照指定字符集转换为字节数组

解码:把字节数组按照指定的字符集转换为字符串

byte[] b = a.getBytes("字符集")//编码
String a = new String(b,"字符集")//解码

解码编码必须一致否则会乱码

英文和数字一般不会乱码,因为兼容ASCII码

字符流

字符流=字节流+编码表

因为UTF-8编码和GBK编码在设计编码时中文需要占2-3个字节,这导致字节流读取会读取半个汉字的情况,也就出现了乱码

而使用字符流就可以很好的解决这个问题

字符流分为

字符输入流

最顶层抽象类为Reader

可以使用其常用子类FileReader类

字符输出流

最顶层抽象类Writer

可以使用其常用子类FileWriter类

请添加图片描述

字符输入流
构造器
public FileReader(File file)
//创建字符输入流管道与源文件接通
public FileReader(String pathname)
//创建字符输入流管道与源文件接通
方法
public int read()
//每次读取一个字符返回,如果发现没有数据会返回-1
public int read(char[] buffer)
//使用字符数组读取,返回读取了多少个字符,没有数据返回-1
字符输出流
构造器
public FileWriter(File file)
//创建字节输出流管道与源文件对象接通
public FileWriter(String filepath)
//创建字节输出流管道与源文件路径接通
public FileWriter(File file,boolean append)
//创建管道连接文件,可以追加数据
public FileWriter(String filepath,boolean append)
//创建管道连接文件,可以追加数据
方法
void write(int c)//写一个字符
void write(String str)//写一个字符串
void write(String str,int off,int len)//写字符串的一部分
void write(char[] ch)//写一个字符数组
void write(char[] ch,int off,int len)//写字符数组的一部分
void flush()//刷新流,把内存中的数据刷新到硬盘中
void close()//关流,自动刷新一次,关流之后对象无法再次使用

缓冲流

对原始流包装,提高了原始流读写数据的性能

原理:缓冲输入/输出流自带了8KB的缓冲池(底层封装了一个8kb的字符数组)

缓冲流的工作原理是先将数据写入内存缓冲区,当缓冲区满时再将数据一次性写入到磁盘或者网络中,这样可以减少实际的读写次数,提高读写效率.

缓冲流的优点

减少IO操作次数

提高读写效率

处理大量数据时,显著提升程序性能

flush()方法

1,

文件以字节形式存在,所以字节流不需要在内存中进行转换,可以直接进入文件,由于字节流不自带缓冲区,使用缓冲流提升巨大,且字节流的flush()方法没有实现(没有方法体).

2,

字符流需要在内存中进行转换,所以需要flush方法手动将数据刷入硬盘,字符流自带缓冲区,所以使不使用缓冲流差距不大

3,

缓冲流在底层创建一个8kb的数组,当数组装满时存入硬盘,减少内存和硬盘的交互,提高效率

IO流体系

请添加图片描述

字节流包装构造
public BufferedInputStream(InputStream is)
//把低级字节输入流包装为一个高级缓冲字节输入流,提高读取性能
public BufferedOutputStream(OutputStream os)
//把低级字节输出流包装为高级缓冲字节输出流,提高写入性能
字符流包装构造
public BufferedReader(Reader r)
//把低级的字符输入流包装为字符缓冲输入流,提高读取性能
特有方法:
public String readLine()
//读取一行数据返回(不包含换行符),如果没有数据可读,会返回null
public BufferedWriter(Writer r)
//把低级的字符输出流包装成一个高级的缓冲字符输出流,提高写入性能
特有方法:
public void newLine()
//根据系统写出换行符

转换流

JAVA IO库中的一种特殊流,

在需要把字节流转成字符流时使用

例如网络编程中发送字节数据需要发送中文时,需要使用转换流转成字符流

用于将字节流转换为字符流

提供了两个类:

InputStreamReader和OutputStreamWriter

转换流的本质属于字符流,所以可以使用字符流中所有的功能

转换流的主要用途是在字节流和字符流之间进行转换,使得在处理文本或者字符数据时更加方便,可以解决使用字节流读取中文出现乱码的问题

输入流转换构造器
InputStreamReader(InputStream in)
//创建一个使用默认字符集的InputStreamReader对象,将给定的字节输入流转为字符流
InputStreamReader(InputStream in,String charsetName)
//创建一个使用指定字符集charsetName的InputStreamReader对象,
//将给定的字节输入流转为字符流
//把原始的字节输入流,按照指定字符集编码成字符输入流
输出流转换构造器
OutputStreamWriter(OutputStream in)
//创建一个使用默认字符集的OutputStreamWriter对象,将给定的字节输出流转为字符流
OutputStreamWriter(OutputStream in,String charsetName)
//创建一个使用指定字符集charsetName的OutputStreamWriter对象,
//将给定的字节输出流转为字符流

序列化流操作

将对象转换为字节流,以便于在网络上传输或者保存到文件

将对象的状态保存,以便于在需要时重新生成

ObjectOutputStream类

将对象序列化为字节流

构造方法创建对象

ObjectOutputStream(OutputStream out)
//将序列化的数据写入给定的输出流out

写出对象

public void writeObject(Object obj)
//将给定的对象obj序列化写入输出流
ObjectInputStream类

将字节流反序列化为对象

构造方法创建对象

ObjectInputStream(InputStream out)
//从给定的输入流in中读取反序列化的数据

读入对象

当读到文件末尾继续读时,会返回EOF异常,需要用trycatch捕获

public Object readObject()
//从输入流中读取字节并反序列化为对象
注:
1,写入对象必须实现Serializable接口

Serializable接口是一个标记接口,没有任何方法需要实现,只是告诉虚拟机,该类对象可以被序列化,如果没有实现该接口,会抛出NotSerializableException异常

2,transient是一个关键字,用于修饰变量.

当一个变量被transient修饰时,将不会被序列化,即在对象被写入文件或通过网络传输时,该变量的值不会被保存或传输

3,在对象序列化为文件后,在反序列化前修改类会异常

在序列化对象时,会根据此类生成一个序列化号,序列化号根据此类的信息自动生成.

更改类中信息时,会重新生成序列化号

导致InvalidClassException异常,因为类的版本与序列化时的版本一致

解决方案:

固定serialVersionUID::使⽤private static final long serialVersionUID显式地声明⼀个恒定的serialVersionUID,确保在类的结构发⽣变化时,

serialVersionUID的值保持不变。这样可以确保序列化和反序列化过程中的版本⼀致性。

eg:

private static final long serialVersionUID
= 123456789;

序列化的使用

将对象提前存在容器中,需要序列化时直接序列化容器对象即可

存入时存入一次容器

读取时也只需读取一次,避免循环判断

IO框架 commons-io

一个Apache开源项目,属于第三方工具包.

提供了一组常用的I/O相关的工具类,用于简化java代码,与官方核心类库无关

常用功能

1,文件操作:复制删除移动等

2,文件过滤:根据文件名和文件后缀对文件过滤

3,字符集操作:将字节数组转成字符串等

使用

下载并导入jar包

创建libs文件夹

复制jar包到文件夹中

在jar包上单击添加为"Add as Library"

官⽅API⽂档地址 : https://commons.apache.org/proper/commons-io/javadocs/api-release/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 正则表达式

一、Oracle 正则表达式相关函数 (1) regexp_like :同 like 功能相似(模糊 匹配) (2) regexp_instr :同 instr 功能相似(返回字符所在 下标) (3) regexp_substr : 同 substr 功能相似&…

七项上榜!通付盾十一度荣登安全牛《中国网络安全行业全景图》

2024年4月12日,安全牛第十一版《中国网络安全行业全景图》(以下简称“全景图”)正式发布。通付盾凭借领先的技术实力与优秀的市场表现,成功入选身份与访问安全、应用与业务安全、移动安全、安全支撑技术与体系四大安全领域。 身份…

宝塔面板部署腾讯云的域名

一、腾讯云,搜索我的证书,点击打开如图所示,点击下砸 二、点击宝塔的证书,然后下载到桌面 三、解压 四、打开宝塔,网站》自己的项目列表中要绑定的ssl 五、对应的文件内容复制进去,保存并启用证书 六、有了…

基于SSM校园招聘信息管理系统的设计与实现说明(内附设计LW + PPT+ 源码下载)

摘 要 随着我国近年来高校不断的进行扩招,2022年全国高校的毕业生人数已经超过一千万人,而在这个时代的大学生早已不像上世纪八九十年代一样,毕业就可以分配工作,所以在当今这个时代毕业生找工作是个非常困难的事情。再加上近几…

[管理者与领导者-158] :团队管理 - 高效执行力 -1- 总体架构、策略、方法、情与法

目录 一、总体架构 二、管理者目标:管理者通过团队获得结果 2.1 考核目标 2.2 高效执行力的指标:时间、成本、质量、数量、满意度 三、管理者的管理策略:结果(头与尾) VS 过程 四、管理手段和方法 五、关于情与…

TinyEMU源码分析之中断处理

TinyEMU源码分析之中断处理 1 触发中断2 查询中断2.1 查询中断使能与pending状态(mie和mip)2.2 查询中断总开关与委托(mstatus和mideleg)2.2.1 M模式2.2.2 S模式2.2.3 U模式 3 处理中断3.1 获取中断编号3.2 检查委托3.3 进入中断3…

【教程】7代核显直通HDMI成功输出 PVE下玩AIO最有性价比的机器

大家好,我是村雨Mura,好久没写教程了,本期是7代核显直通,重点在于HDMI输出画面 本教程理论上适用于4代以后intel带核显CPU,如果你有直通成功经验欢迎评论区分享 前面有点啰嗦,想直接看教程,直…

【每日练习】二叉树

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:二叉树 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 文章目录 一、100. 相同的树1. 题目简介2.…

Go语言中channel和互斥锁的应用场景

面对一个并发问题,我们的解决方案是使用channel还是互斥锁来实现并不总是很清晰。因为Go提倡使用通信来共享内存,所以一个常见的错误就是总是强制使用channel,不管实际情况如何。但是我们应该把这两种选择作为互补手段。 首先,简单回顾一下Go语言中的channel:channel是一种交…

同步检查继电器DT-13/200额定电压100V柜内安装板前接线JOSEF约瑟

系列型号 DT-13/200同步检查继电器; DT-13/160同步检查继电器; DT-13/130同步检查继电器; DT-13/120同步检查继电器; DT-13/90同步检查继电器; DT-13/254同步检查继电器; 同步检查继电器DT-13/200 用途 DT-13型同步检查继电器用于两端供电线路的自动重合闸线路中&…

2024 年第十四届 Mathorcup 数学应用挑战赛题目C 题 物流网络分拣中心货量预测及人员排班完整思路以及源代码分享,仅供学习

电商物流网络在订单履约中由多个环节组成,图1是一个简化的物流网络示意图。其中,分拣中心作为网络的中间环节,需要将包裹按照不同流向进行分拣并发往下一个场地,最终使包赛到达消费者手中。分拣中心管理效率的提升,对整…

物联网SaaS平台

在信息化、智能化浪潮席卷全球的今天,物联网SaaS平台作为推动工业数字化转型的重要工具,正日益受到广泛关注。那么,物联网SaaS平台究竟是什么?HiWoo Cloud作为物联网SaaS平台又有哪些独特优势?更重要的是,它…

使用unicloud-map 无法展示poi的天坑

天坑!天坑!天坑 使用unicloud-map的天坑 202404121722,昨天晚上发现uni-admin中导入了unicloud-map管理端之后在chrome浏览器由于地图定位失败,一直没有办法新增poi,不过后面发现safari浏览器是可以定位出来的,所以今…

上网行为管理软件怎么选择?哪个软件好?| 三款热门行为审计软件分享

上网行为监控系统是一种用于监控和管理互联网使用行为的系统。 这种系统主要用于企业和学校等机构,以控制和管理员工或学生在工作时间或学习时间内对互联网的使用。 而现在的企业越来越信息化,随之而来的信息危机也丛生不断,企业管理软件也…

VXWorks6.9 + Workbench3.3 Simulation 代码调试

VxWorks系列传送门 本章是基于前一篇《VXWorks6.9 Workbench3.3 开发环境部署》来进行讲解的,在上一篇我们创建了一个Hello World 的项目,并将编译后的可执行文件放到了VxWorks - FTP共享文件目录下,顺利的在VxWin 系统中跑起来。 本篇着重讲…

【学习】Spring IoCDI

🎥 个人主页:Dikz12📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 Spring 是什么? 什么是 IoC容器? 传统开发模式 loC开发模式 IoC的优势 IoC 的使用 Bean的…

TMS320F280049 EPWM模块--ET子模块(7)

下图是ET子模块在EPWM中的位置。可以看到ET子模块相对较独立。接收多种信号,处理后传递给PIE和ADC。 下图是ET的内部框图,可以更具体的看到输入和输出信号。 ET内部也可以软件force产生事件信号。ET输出时可以做分频,也就是接收n次输入后才输…

外贸开发信必知技巧:高回复率不再是梦

外贸行业在Zoho的客户群体中占比较高。因为我们的国际化背景、丰富的产品组合、多语言多币种跨时区、高性价比等特点,成为外贸企业开展业务的选择。在和外贸客户沟通中,发现无论是外贸大拿还是新手小白,大家遇到一个共同的问题——发出去的开…

5252DG 外场通信测试仪范围:9kHz~6.3GHz/9GHz/20GHz

5252DG 外场通信测试仪 率范围:9kHz~6.3GHz/9GHz/20GHz 简述 5252DG外场通信测试仪是集合高性能信号分析模块、多制式解析算法软件于一体的手持式测试仪表,是为满足运营商对移动通信的测试而推出的全新平台。其拥有更高测试频率、更大解析带宽、更快扫…

单例19c RMAN数据迁移方案

一、环境说明 源库 目标库 IP 192.168.37.200 192.168.37.202 系统版本 RedHat 7.9 RedHat 7.9 数据库版本 19.3.0.0.0 19.3.0.0.0 SID beg beg hostname beg rman 数据量 1353M 说明:源库已经创建数据库实例,并且存在用户kk和他创建的表空间…
最新文章