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

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...