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

IO基础(字符集与字符流)

在字节流中,文件中的中文显示的是乱码。

在计算机存储体系中,以字节为最小存储单位,一个英文占一字节

字符集类型

  • ASCII字符集,又叫编码表,编码表中有128个数据,其中大小写字母、符号、数字等。
  • GB2312字符集:1981年5月1日实施的简体中文汉字编码国家标准,收录了7445个图形字符,其中包括6763个简体汉字。
  • BIG5字符集:台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施。
  • GBK字符集:2000.3.17发布,收录21003个汉字。包含国家标准GB13000-1中的全部中日韩汉字,和BIG编码中的所有汉字。(简体中文Windows系统默认使用GBK,系统显示ANSI)
  • Unicode字符集:国家标准字符集,它将世界各种语言的每一个字符定义一个唯一的编码,以满足跨语言、跨平台文本信息转换。
GBK 存储规则:

GBK存储英文,完全兼容ASCII码。

存储中文

扩展:解码都是直接转为十进制

Unicode万国码存储规则

UTF存储英文:有三个规则:UTF-8编码规则、UTF-16规则、UTF-32规则

UTF存储中文:

乱码出现原因:

  • 读取数据时未读完整个汉字,当利用字节流读取文字时,一个汉字会被分为3个字节读取 
  • 编码和解码时的方式不统一,eg

防止乱码出现办法:

  1. 不要用字节流读取文本文件
  2. 编码解码使用同一个码表,同一个编码方式
 编码与解码方法

编码:将我们要存储的数据根据一定的规则编译为计算机能够存储的字节数据

public byte[ ]  getBytes()使用默认方式进行编码
public byte[ ]  getBytes(String charsetName)使用指定方式进行编码

解码:

String(byte[ ]  bytes)使用默认方式进行解码
String(byte[ ]  bytes,String charsetName)使用指定方式进行编码

字符流

字符流的底层是字节流:

字符流=字节流+字符集

特点:

  • 输入流:一次读一个字节,遇到中文时,一次读多个字节(与字符集有关)
  • 输出流:底层会把数据按照指定的编码方式进行编码,变成字节在写到文件中

 适合纯文本文件的读写操作。

字符流:Reader(字符输入流)    Writer(字符输出流)

FileReader

使用步骤:

1.创建字符输入流对象

public FileReader(File fille)创建字符输入流关联本地文件
public FileReader(String pathname)创建字符输入流关联本地文件

File对象表示的文件路径以及字符串表示的文件路径,如果文件不存在就会报错

2.读取数据

public int read()读取数据,读到末尾返回-1
public int read(char[ ] buffer)读取多个数据,读到末尾返回-1
  • 空参读取:按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数(read返回的十进制,是字符集上的数字)
  • 读到文件末尾,read方法返回-1

3.释放资源

public int close()         //释放资源/关流

 空参read()方法的使用:

有参read()方法的使用:

FileWriter

FileWrite构造方法:

public FileWriter(File file )创建字符输出流关联本地文件
public FileWriter(String pathname)创建字符输出流关联本地文件
public FileWriter(File file,boolean append)创建字符输出流关联本地文件,续写
public FileWriter(String pathname,boolean append)创建字符输出流关联本地文件,续写

FileWrite成员方法:

void write(int c)写出一个字符
void write(String str)写出一个字符串
void write(String str,int off,int len)写出一个字符串的一部分
void write(char[ ] cbuf)写出一个字符数组
void write(char[ ] cbuf,int off,int len)写出字符数组的一部分

使用流程:

1.创建字符输出流对象

  • 参数是字符串表示的路径或者File对象
  • 如果文件不存在会创建一个新的文件,但是要保证父级路径是存在
  • 如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

2.写数据

  • 如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

3.释放资源

  • 每次使用完流都要释放资源

 使用步骤代码实现:

StringBuilder类

对字符串拼接原理:(String类在Java流程控制中有说明)

利用StringBuilder可变字符串序列,解决浪费内容问题。

String和StringBuilder的区别:

  • String:内容不可变
  • StringBuilder:内容可变

StringBuilder主要构造方法: 

StringBuilder()无参构造,创建一个空白可变字符串对象
StringBuilder(String str)指定字符串内容的构造方法

代码演示:

 StringBuilder方法
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()返回相关的字符序列

代码演示:

 

所以在添加数据时,可以不创建另一个对象存数据。

 反转,顾名思义,将sb中的内容从后往前输出。

StringBuilder和String相互转换

StringBuilder转换为String

public String toString():通过toString()就可以实现

String转换为StringBuilder

public StringBuilder(String s)

代码演示:

拼接字符串

定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,在控制台输出结果。eg:int[ ] arr={1,2,3}l,执行方法后输出结果:[1,2,3]

综合练习

拷贝

字节流:任意类型的文件

字符流:读取纯文本文件中的数据,往纯文本文件中写出数据

拷贝一个文件夹加,考虑子文件夹

//拷贝文件夹下所有内容
public class Test1 {public static void main(String[] args) throws IOException {//创建对象,数据源File src=new File("D:\\test");//目的地File dest=new File("D:\\dest");//调用方法开始拷贝copydir(src,dest);}//创建拷贝方法private static void copydir(File src, File dest) throws IOException {//dest不存在,创建dest文件夹dest.mkdirs();//1.进入数据源File[] files = src.listFiles();//记录文件夹中的文件及路//2.遍历数组for (File file:files){//增强for循环,将数组files中的每一项赋值给fileif (file.isFile()){//3.判断文件,拷贝 文件开始,文件结束,dest是文件夹FileInputStream fis=new FileInputStream(file);//要拷贝的文件FileOutputStream fos=new FileOutputStream(new File(dest,file.getName()));//文件的目的地byte[] bytes=new byte[1024];//一个读取1024个字节int len;while ((len=fis.read(bytes))!=-1){fos.write(bytes,0,len);}fos.close();//4.关闭资源,先开的后关fis.close();}else{//4.判断文件夹,递归copydir(file,new File(dest,file.getName()));//要拷贝的文件夹,目的地}}}
}
文件加密

为了保证文件的安全性,需要对原始文件进行加密存储,再使用的时候在对其进行解密处理。

加密原理:对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。

解密原理:读取加密之后的文件,按照加密的规则反向操作,变成原始文件。

//文件加密
public class Test2 {public static void main(String[] args) throws IOException {//异或:^ 相同为0 不同为1//eg:100^10=110     110^10=100FileInputStream fis=new FileInputStream("C_S\\b.png");FileOutputStream fos=new FileOutputStream("C_S\\b1.png");//加密处理int b;while ((b=fis.read())!=-1){fos.write(b^2);}fos.close();fis.close();}
}
修改文件中的数据

文本文件中有以下的数据:2-1-9-4-7-8

将文件中的数据进行排序,变成以下的数据:1-2-4-7-8-9

代码实现:

//更改文件内容
public class Test3 {public static void main(String[] args) throws IOException {//1.读取数据FileReader fr=new FileReader("C_S\\a.txt");//数据读入程序StringBuilder sb=new StringBuilder();//StringBuilder功能:拼接读取到的数据int ch;while ((ch=fr.read())!=-1){sb.append((char)ch);//将读取到的数据拼接到sb中}fr.close();System.out.println(sb);//2.排序String str=sb.toString();//将sb内容变成字符串形式String[] arrstr=str.split("-");//根据-进行切割,得到字符串类型的219478ArrayList<Integer> list=new ArrayList<>();for(String s:arrstr){//遍历字符串数组int i = Integer.parseInt(s);//一次能够将一个字符串类型整数变成int性整数list.add(i);//将转换后的数字保存在list集合中}System.out.println(list);//测试集合是否有数字Collections.sort(list);//集合中的排序方法,默认从小到大System.out.println(list.size());//3.写出FileWriter fw=new FileWriter("C_S\\a.txt");for (int i = 0; i < list.size(); i++) {//遍历集合listif (i==list.size()-1){//如果说集合中最后一位,则直接输出fw.write(list.get(i)+"");//不能直接写i,write会将其转换对应ASII码// ,+“”,将其转换为字符串输出}else {//不是最后一位,加-输出fw.write(list.get(i)+"-");}}fw.close();}
}

 

 

相关文章:

IO基础(字符集与字符流)

在字节流中&#xff0c;文件中的中文显示的是乱码。 在计算机存储体系中&#xff0c;以字节为最小存储单位&#xff0c;一个英文占一字节。 字符集类型 ASCII字符集&#xff0c;又叫编码表&#xff0c;编码表中有128个数据&#xff0c;其中大小写字母、符号、数字等。GB2312…...

LLM应用-prompt提示:RAG query重写、相似query生成 加强检索准确率

参考&#xff1a; https://zhuanlan.zhihu.com/p/719510286 1、query重写 你是一名AI助手&#xff0c;负责在RAG&#xff08;知识库&#xff09;系统中通过重构用户查询来提高检索效果。根据原始查询&#xff0c;将其重写得更具体、详细&#xff0c;以便更有可能检索到相关信…...

[python脚本处理文件入门]-17.Python如何操作Excel文件的读写

哈喽,大家好,我是木头左! 在Python中,处理Excel文件最常用的库之一是xlrd,它用于读取Excel文件。而当需要创建或写入Excel文件时,xlwt库则是一个不错的选择。这两个库虽然功能强大,但使用起来也非常简单直观。 安装与导入 确保你已经安装了这两个库。如果没有安装,可以…...

深度理解进程的概念(Linux)

目录 一、冯诺依曼体系 二、操作系统(OS) 设计操作系统的目的 核心功能 系统调用 三、进程的概念与基本操作 简介 查看进程 通过系统调用获取进程标识符 通过系统调用创建进程——fork() 四、进程的状态 操作系统中的运行、阻塞和挂起 理解linux内核链表 Linux的进…...

【C++】STL容器中的比较函数对象

目录 set、map容器 priority_queue容器 在STL中涉及到以某种规则排序的容器都需要比较函数对象&#xff0c;比如&#xff1a;set、map、priority_queue这些容器内部都是依赖比较函数对象以某种规则存储数据的。STL容器中的比较函数对象可以是&#xff1a;函数指针、仿函数(函…...

深度学习基础02_损失函数BP算法(上)

目录 一、损失函数 1、线性回归损失函数 1.MAE损失 2.MSE损失 3.SmoothL1Loss 2、多分类损失函数--CrossEntropyLoss 3、二分类损失函数--BCELoss 4、总结 二、BP算法 1、前向传播 1.输入层(Input Layer)到隐藏层(Hidden Layer) 2.隐藏层(Hidden Layer)到输出层(Ou…...

6.584-Lab4A

6.584-LabA HomeworkReference CodeReference Blog 通过作业提供的概览图可以看出整个系统的组成&#xff1a;用户 Clerk 会发出命令&#xff08;Get、Put、Append&#xff09;到每个 Service&#xff0c;每个 Service 接收到命令后向下传递到 RaftCode 层&#xff0c;由 RaftC…...

语义版本控制

注意&#xff1a; 本文内容于 2024-11-27 22:25:05 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;语义版本控制。感谢您的关注与支持&#xff01; 由于自己平时喜欢写点小玩意&#xff0c;自然而…...

深入理解HTML基本结构:构建现代网页的基石

深入理解HTML基本结构&#xff1a;构建现代网页的基石 在数字时代&#xff0c;HTML&#xff08;超文本标记语言&#xff09;是构建和设计网页的基础。了解HTML的基本结构对于任何希望掌握网页开发的人来说至关重要。本文将详细介绍HTML文件的基本骨架&#xff0c;包括其核心标…...

一体化数据安全平台uDSP 入选【年度创新安全产品 TOP10】榜单

近日&#xff0c;由 FreeBuf 主办的 FCIS 2024 网络安全创新大会在上海隆重举行。大会现场揭晓了第十届 WitAwards 中国网络安全行业年度评选获奖名单&#xff0c;该评选自 2015 年举办以来一直饱受赞誉&#xff0c;备受关注&#xff0c;评选旨在以最专业的角度和最公正的态度&…...

【机器学习】机器学习的基本分类-监督学习(Supervised Learning)

监督学习是一种通过已有的输入数据&#xff08;特征&#xff09;和目标输出&#xff08;标签&#xff09;对模型进行训练的机器学习方法&#xff0c;旨在学到一个函数&#xff0c;将输入映射到正确的输出。 1. 监督学习概述 监督学习需要&#xff1a; 输入数据&#xff08;特…...

Oracle之提高PLSQL的执行性能

目录 1、SQL解析详解 2、演示示例 3、启用Oracle跟踪事件 4、查看改造后SQL性能对比结果 更多技术干货,关注个人博客吧 1、SQL解析详解 SQL解析是数据块处理SQL语句不可缺少的步骤,是在解析器中执行的。将SQL转换成数据库可以执行的低级指令。 SQL解析分为硬解析和软…...

[VSCode] vscode下载安装及安装中文插件详解(附下载文件)

前言 vscode 链接&#xff1a;https://pan.quark.cn/s/3acbb8aed758 提取码&#xff1a;dSyt VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和Git版本控制系统。 …...

PHP中类名加双冒号的作用

在 PHP 中&#xff0c;类名加双冒号&#xff08;::&#xff09; 是一种用于访问类的静态成员和常量的语法。它也可以用来调用类的静态方法和访问 PHP 的类相关关键词&#xff08;如 parent、self 和 static&#xff09;。以下是详细的解释和用法。 1. 用途概述 :: 被称为作用域…...

前端编程训练 异步编程篇 请求接口 vue与react中的异步

文章目录 前言代码执行顺序的几个关键点接口请求vue与react中的异步vue中的异步react的state修改异步 前言 本文是B站三十的前端课的笔记前端编程训练,异步编程篇 代码执行顺序的几个关键点 我们可以理解为代码就是一行一行&#xff0c;一句一句是执行&#xff08;定义变量&…...

【kafka03】消息队列与微服务之Kafka 读写数据

Kafka 读写数据 参考文档 Apache Kafka 常见命令 kafka-topics.sh #消息的管理命令 kafka-console-producer.sh #生产者的模拟命令 kafka-console-consumer.sh #消费者的模拟命令 创建 Topic 创建topic名为 chen&#xff0c;partitions(分区)为3&#xff0…...

【分布式系统】唯一性ID的实现

1、UUID&#xff08;通用唯一标识符&#xff09; 1、UUID本身 一种用于标识信息的标准化方法。一个128位的数字&#xff0c;常表示为32个十六进制数字&#xff0c;以连字符分隔成五组&#xff1a;8-4-4-4-12。 版本&#xff1a; UUID有不同的版本&#xff0c;最常见的是基于时…...

哪里能找到好用的动物视频素材 优质网站推荐

想让你的短视频增添些活泼生动的动物元素&#xff1f;无论是搞笑的宠物瞬间&#xff0c;还是野外猛兽的雄姿&#xff0c;这些素材都能让视频更具吸引力。今天就为大家推荐几个超实用的动物视频素材网站&#xff0c;不论你是短视频新手还是老手&#xff0c;都能在这些网站找到心…...

SRAM芯片数据采集解决方案

SRAM芯片数据采集解决方案致力于提供一种高效、稳定且易于操作的方法&#xff0c;以确保从静态随机存取存储器SRAM芯片中准确无误地获取数据。 这种解决方案通常包括硬件接口和软件工具&#xff0c;它们协同工作&#xff0c;以实现对SRAM芯片的无缝访问和数据传输。 在硬件方…...

【贪心算法第七弹——674.最长连续递增序列(easy)】

目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码分析 1.题目解析 题目来源 674.最长递增子序列——力扣 测试用例 2.算法原理 贪心思路 3.实战代码 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int n nums.size();in…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...