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…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...
