当前位置: 首页 > news >正文

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/

相关文章:

java:字符集和字符流

字符集 规定了字符和二进制之间对应关系的一张表 字节是计算机最基本的存储单位 字符则是通过字符组成和编码而成的文本 常见字符集 1,ASCII字符集 基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号 一个字节表示一个字符 所有的字符集均兼容ASCII…...

Java常见的设计模式

Java常见的设计模式 工厂模式(Factory Pattern)单例模式(Singleton Pattern)代理模式模式(Proxy Pattern)适配器模式(Adapter Pattern)观察者模式(Observer Pattern&…...

Oracle 19c RAC集群相关日志

1.DB日志(数据库日志) Redo Log(重做日志): 在Oracle数据库中,重做日志记录了数据库发生的所有修改操作,包括数据的插入,更新和删除。在RAC的环境中,每个实例都有自己的重…...

TR4 - Transformer中的多头注意力机制

目录 前言自注意力机制Self-Attention层的具体机制Self-Attention 矩阵计算 多头注意力机制例子解析 代码实现总结与心得体会 前言 多头注意力机制可以说是Transformer中最主要的模块,没有之一。这次我们来仔细分析一下注意力机制与多头注意力机制。 自注意力机制…...

three.js跟着教程实现VR效果(四)

参照教程:https://juejin.cn/post/6973865268426571784(作者:大帅老猿) 1.WebGD3D引擎 用three.js (1)使用立方体6面图 camera放到 立方体的中间 like “回” 让贴图向内翻转 (2)使…...

AI预测体彩排3第1弹【2024年4月12日预测--第1套算法开始计算第1次测试】

前面经过多个模型几十次对福彩3D的预测,积累了一定的经验,摸索了一些稳定的规律,有很多彩友让我也出一下排列3的预测结果,我认为目前时机已成熟,且由于福彩3D和体彩排列3的玩法完全一样,我认为3D的规律和模…...

spring 中的控制反转

在Spring框架中,控制反转(IoC,Inversion of Control)是指将对象的创建和管理交给了容器,而不是在应用程序代码中直接创建对象。在传统的编程模式中,应用程序代码通常负责创建对象并管理它们的生命周期&…...

GO并发总是更快吗?

许多开发人员的一个误解是,并发解决方案总是比串行更快,大错特错。解决方案的整体性能取决于许多因素,例如,结构的效率(并发)、可以并行处理的部分以及计算单元的竞争程度。 1. GO调度 线程是操作系统可以执行的最小单元。如果一个进程想要同时执行多个动作,它可以启动…...

echarts折线图自定义打点标记小工具

由于没研究明白echarts怎么用label和lableLine实现自定义打点标记&#xff0c;索性用markPoint把长方形压扁成线模拟了一番自定义打点标记&#xff0c;记录下来备用。&#xff08;markLine同理也能实现&#xff09; 实现代码如下&#xff1a; <!DOCTYPE html> <html…...

【图论】Leetcode 200. 岛屿数量【中等】

岛屿数量 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以…...

酒店大厅装水离子雾化壁炉前和装后对比

在酒店大厅装水离子雾化壁炉之前和之后&#xff0c;大厅的氛围和体验会有显著的对比&#xff1a; 装水离子雾化壁炉之前&#xff1a; 传统感&#xff1a;在壁炉安装之前&#xff0c;大厅可能会有传统的装饰或者简单的暖气设备&#xff0c;缺乏现代化的元素。这种传统感可能会…...

城市内涝与海绵城市规划设计中的水文水动力模拟

原文链接&#xff1a;城市内涝与海绵城市规划设计中的水文水动力模拟https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601198&idx5&sn35b9e5e3961ea2f190f9742236a7217f&chksmfa820dc9cdf584df97633f64d19bdc3e5f7d1a5a85000c8f040e1953c51b9b39c87b5…...

C++项目实战与经验分享

在编程世界中,C++ 是一种功能强大且灵活的编程语言,广泛应用于系统级编程、游戏开发、嵌入式系统以及高性能计算等领域。本文将分享一个基于C++的图像处理系统项目实战经验,并深入探讨在开发过程中遇到的问题及解决方案。 一、项目概述 本次项目实战的目标是开发一个基于C…...

Day17_学点JavaEE_转发、重定向、Get、POST、乱码问题总结

1 转发 转发&#xff1a;一般查询了数据之后&#xff0c;转发到一个jsp页面进行展示 req.setAttribute("list", list); req.getRequestDispatcher("student_list.jsp").forward(req, resp);2 重定向 重定向&#xff1a;一般添加、删除、修改之后重定向到…...

Mouse IFN-α ELISA kit (Quick Test)

干扰素α&#xff08;IFN-α&#xff09;是一类由免疫细胞分泌的内源性调节因子&#xff0c;也被称为白细胞干扰素&#xff0c;主要参与响应病毒感染的先天性免疫。 基于结构特征、受体、细胞来源和生物活性的不同&#xff0c;干扰素可被分为Ⅰ、Ⅱ、Ⅲ三种类型&#xff0c;其中…...

AMD Tensile 简介与示例

按照知其然&#xff0c;再知其所以然的认知次序进行 1&#xff0c;下载代码 git clone --recursive https://github.com/ROCm/Tensile.git 2&#xff0c;安装 Tensile cd Tensile mkdir build cd build ../Tensile/bin/Tensile ../Tensile/Configs/rocblas_dgemm_nn_asm_full…...

Rust语言

文章目录 Rust语言一&#xff0c;Rust语言是什么二&#xff0c;Rust语言能做什么&#xff1f;Rust语言的设计使其适用于许多不同的领域&#xff0c;包括但不限于以下几个方面&#xff1a;1. 传统命令行程序&#xff1a;2. Web 应用&#xff1a;3. 网络服务器&#xff1a;4. 嵌入…...

排序算法之冒泡排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性冒泡排序O(n^2 )O(n)O(n^2)O(1)In-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b; 不…...

js打印页面源码 ,打印选取的容器里的内容,打印指定内容

js打印页面源码 &#xff0c;打印选取的容器里的内容&#xff0c;打印指定内容 效果 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&…...

算法练习第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV 123.买卖股票的最佳时机III class Solution {public int maxProfit(int[] prices) {//dp[i][j] 第i天买卖股票获得的最大利润/**j0不操作j1第一次持有j2第一次不持有j3第二次持有j4第二次不持有dp[i][0] dp[i-1][0]d…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...