java:字符集和字符流

news2024/11/25 2:31:20

字符集

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

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

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

常见字符集

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.coloradmin.cn/o/1589722.html

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

相关文章

论文复现:nn.L1Loss()

nn.L1Loss() 是 PyTorch 中的一个损失函数,属于 torch.nn 模块的一部分。它计算预测值和真实值之间差的绝对值的平均值,也就是 L1 距离(或曼哈顿距离)。这个损失函数常用于回归任务,特别是当你希望减少异常值对总体损失…

Jenkins+AWS CodeCommit(git)

问题 需要使用Jenkins搭建一套CI流,即通过git代码托管拉取代码,构建自定分支的代码,构建出jar,并进一步构建出docker镜像,并推送到docker私有库中。 准备 AWS云准备 这里假设已经在CodeCommit已经存在私有git代码仓…

springCloudAlibaba集成sentinel实战(超详细)

一、Sentinel介绍 1. 什么是Sentinel Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 分布式系统的流量防卫兵: 随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流…

纯css实现左右拖拽改变盒子大小

效果&#xff1a; 代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html;charsetutf-8"><title></title><style>body {background-color: black;color: white;}.column {ove…

超2亿欧元,全球首个量子专项基金启动新一轮募资

今天&#xff0c;Quantonation宣布已完成其第二期基金的7000万欧元募资&#xff0c;计划到2025年初达到2亿欧元的规模。这家法国风险投资公司在全球范围内对量子计算、传感和通信应用领域的初创公司进行投资&#xff0c;主要关注于预种子轮和种子轮阶段。 其第一期基金在2021年…

2024/4/5—力扣—字符串相乘

代码实现&#xff1a; 方法一&#xff1a;常规解法——超出整数表示范围 long long char_to_num(char *str) {long long num 0;for (int i 0; i < strlen(str); i) {num num * 10 (str[i] - 0);}return num; }char* multiply(char *num1, char *num2) {long long a cha…

零基础教程|四步学会自制宣传手册

在当今竞争激烈的市场中&#xff0c;一本精美而引人注目的宣传手册是吸引客户和推广产品的重要工具。但对于许多人来说&#xff0c;制作宣传手册似乎是一项艰巨的任务&#xff0c;特别是对于零基础的人来说。然而&#xff0c;通过以下四个简单的步骤&#xff0c;您也可以轻松学…

每日两题 / 142. 环形链表 II 146. LRU 缓存(LeetCode热题100)

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 用哈希记录走过的节点即可 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:Lis…

Partisia Blockchain或被低估,有望在后续市场迎来爆发

在今年 3 月&#xff0c;隐私公链 Partisia Blockchain 迎来了重要的进展&#xff0c;该生态通证 $MPC 上线了交易所&#xff0c;目前 $MPC 通证可以在 Kucoin、Gate、BitMart、Bitfinex、Bitture 等平台交易&#xff0c;并将在不久后上线 MEXC 平台。 在上个月上线市场至今&am…

静态路由协议实验1

要求&#xff1a; 使用静态路由协议使得全网可达。 第一步、规划IP地址。并配置IP。 第二步、写静态路由 [r1]ip route-static 192.168.3.0 24 192.168.2.2 [r1]ip route-static 192.168.4.0 24 192.168.2.2 [r1]ip route-static 192.168.5.0 24 192.168.2.2[r2]ip route-st…

【JAVA基础篇教学】第三篇:Java循环控制语句

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第三篇&#xff1a;Java循环控制语句。 在Java中&#xff0c;循环控制语句用于重复执行一段代码&#xff0c;直到满足特定条件为止。Java提供了多种类型的循环语句&#xff0c;包括for循环、while循环和do-while循环。 一…

广州南沙番禺联想SR530服务器主板传感器故障维修

今日分享一例广州市南沙区联想ThinkSystem SR530服务器sensor sysbrd vol故障问题维修案例&#xff1b; 服务器型号是&#xff1a;Lenovo thinksystem sr530 g6服务器 服务器所在位置&#xff1a;广东省广州市南沙区 服务器故障问题&#xff1a;机房异常停电&#xff0c;来电后…

视频实例分割 | 基于ViT实现的端到端end-to-end+query-based的视频实例分割

项目应用场景 面向视频实例分割场景&#xff0c;项目采用 Vision-Transformer 深度学习算法来实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 创建 python 开发环境 conda create --name tevit python3.7.7 conda activate tevit (2) 安装依赖 torch1.9.0 torch…

三年了,期待下一个三年

第一个三年 时间好快&#xff0c;距离我发布我第一篇文章都已经三个年头了。 转眼也从大一新生变成了大四打工人。 在平台上发布博客&#xff0c;分享自己的项目、学习思路、解决的bug都带给我很多收获。 平台上的粉丝&#xff0c;阅读量等&#xff0c;也让我的简历更加出彩。…

el-date-picker禁用指定范围的日期

elementUI中el-date-picker禁用指定日期之前或之后的日期 通过配置picker-options配置指定禁用日期&#xff08;pickerOptions写到data里面&#xff09; <el-date-pickerv-model"date"type"date"size"small"value-format"yyyy-MM-dd&qu…

oceanbase一键安装

安装文档&#xff1a;https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000642554 软件下载 https://www.oceanbase.com/softwarecenter 安装obd yum install -y yum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBa…

关于nvm node.js的按照

说明&#xff1a;部分但不全面的记录 因为过程中没有截图&#xff0c;仅用于自己的学习与总结 过程中借鉴的优秀博客 可以参考 1,npm install 或者npm init vuelatest报错 2&#xff0c;了解后 发现是nvm使用的版本较低&#xff0c;于是涉及nvm卸载 重新下载最新版本的nvm 2…

c++ 中文转拼音的封装, char 类型 不支持 中文 已解决

在日常业务中&#xff0c;需要进行中文转拼音的检索。已便实现对应的 模糊搜索。 使用方法 std::string res "我是中国人";char* result new char[res.length() 1];for (int i 0; i < res.length(); i){result[i] res[i];}result[res.length()] \0;std::str…

【Hadoop大数据技术】——Flume日志采集系统(学习笔记)

&#x1f4d6; 前言&#xff1a;在大数据系统的开发中&#xff0c;数据收集工作无疑是开发者首要解决的一个难题&#xff0c;但由于生产数据的源头丰富多样&#xff0c;其中包含网站日志数据、后台监控数据、用户浏览网页数据等&#xff0c;数据工程师要想将它们分门别类的采集…

四、SpringBoot3 整合 Druid 数据源

本章概要 创建程序引入依赖启动类配置文件编写编写 Controller启动测试问题解决 4.1 创建程序 4.2 引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://ww…