当前位置: 首页 > 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…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...