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实现自定义打点标记,索性用markPoint把长方形压扁成线模拟了一番自定义打点标记,记录下来备用。(markLine同理也能实现) 实现代码如下: <!DOCTYPE html> <html…...
【图论】Leetcode 200. 岛屿数量【中等】
岛屿数量 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以…...
酒店大厅装水离子雾化壁炉前和装后对比
在酒店大厅装水离子雾化壁炉之前和之后,大厅的氛围和体验会有显著的对比: 装水离子雾化壁炉之前: 传统感:在壁炉安装之前,大厅可能会有传统的装饰或者简单的暖气设备,缺乏现代化的元素。这种传统感可能会…...
城市内涝与海绵城市规划设计中的水文水动力模拟
原文链接:城市内涝与海绵城市规划设计中的水文水动力模拟https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601198&idx5&sn35b9e5e3961ea2f190f9742236a7217f&chksmfa820dc9cdf584df97633f64d19bdc3e5f7d1a5a85000c8f040e1953c51b9b39c87b5…...
C++项目实战与经验分享
在编程世界中,C++ 是一种功能强大且灵活的编程语言,广泛应用于系统级编程、游戏开发、嵌入式系统以及高性能计算等领域。本文将分享一个基于C++的图像处理系统项目实战经验,并深入探讨在开发过程中遇到的问题及解决方案。 一、项目概述 本次项目实战的目标是开发一个基于C…...
Day17_学点JavaEE_转发、重定向、Get、POST、乱码问题总结
1 转发 转发:一般查询了数据之后,转发到一个jsp页面进行展示 req.setAttribute("list", list); req.getRequestDispatcher("student_list.jsp").forward(req, resp);2 重定向 重定向:一般添加、删除、修改之后重定向到…...
Mouse IFN-α ELISA kit (Quick Test)
干扰素α(IFN-α)是一类由免疫细胞分泌的内源性调节因子,也被称为白细胞干扰素,主要参与响应病毒感染的先天性免疫。 基于结构特征、受体、细胞来源和生物活性的不同,干扰素可被分为Ⅰ、Ⅱ、Ⅲ三种类型,其中…...
AMD Tensile 简介与示例
按照知其然,再知其所以然的认知次序进行 1,下载代码 git clone --recursive https://github.com/ROCm/Tensile.git 2,安装 Tensile cd Tensile mkdir build cd build ../Tensile/bin/Tensile ../Tensile/Configs/rocblas_dgemm_nn_asm_full…...
Rust语言
文章目录 Rust语言一,Rust语言是什么二,Rust语言能做什么?Rust语言的设计使其适用于许多不同的领域,包括但不限于以下几个方面:1. 传统命令行程序:2. Web 应用:3. 网络服务器:4. 嵌入…...
排序算法之冒泡排序
目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性冒泡排序O(n^2 )O(n)O(n^2)O(1)In-place稳定 稳定:如果A原本在B前面,而AB,排序之后A仍然在B的前面; 不…...
js打印页面源码 ,打印选取的容器里的内容,打印指定内容
js打印页面源码 ,打印选取的容器里的内容,打印指定内容 效果 代码 <!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…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
SpringCloud优势
目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...
