庖丁解牛:NIO核心概念与机制详解 07 _ 字符集
文章目录
- Pre
- 概述
- 编码/解码
- 处理文本的正确方式
- 示例程序
- Code

Pre
庖丁解牛:NIO核心概念与机制详解 01
庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现
庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片
庖丁解牛:NIO核心概念与机制详解 04 _ 分散和聚集
庖丁解牛:NIO核心概念与机制详解 05 _ 文件锁定
庖丁解牛:NIO核心概念与机制详解 06 _ 连网和异步 I/O
概述
我们将看一下如何使用 Charsets 处理文本数据
- 为给定的字符编码创建 Charset
- 使用该 Charset 解码和编码文本数据
编码/解码
要读和写文本,我们要分别使用 CharsetDecoder 和 CharsetEncoder。将它们称为 编码器 和 解码器
处理文本的正确方式
从一个文件中读取一些文本,并将该文本写入另一个文件。但是它把该数据当作文本数据,并使用 CharBuffer 来将该数句读入一个 CharsetDecoder 中。同样,它使用 CharsetEncoder 来写回该数据。
假设字符以 ISO-8859-1(Latin1) 字符集(这是 ASCII 的标准扩展)的形式储存在磁盘上。尽管我们必须为使用 Unicode 做好准备,但是也必须认识到不同的文件是以不同的格式储存的,而 ASCII 无疑是非常普遍的一种格式
事实上,每种 Java 实现都要求对以下字符编码提供完全的支持:
- US-ASCII
- ISO-8859-1
- UTF-8
- UTF-16BE
- UTF-16LE
- UTF-16
示例程序
在打开相应的文件、将输入数据读入名为 inputData 的 ByteBuffer 之后,我们的程序必须创建 ISO-8859-1 (Latin1) 字符集的一个实例:
Charset latin1 = Charset.forName( "ISO-8859-1" );
然后,创建一个解码器(用于读取)和一个编码器 (用于写入):
CharsetDecoder decoder = latin1.newDecoder();
CharsetEncoder encoder = latin1.newEncoder();
为了将字节数据解码为一组字符,我们把 ByteBuffer 传递给 CharsetDecoder,结果得到一个 CharBuffer:
CharBuffer cb = decoder.decode( inputData );
如果想要处理字符,我们可以在程序的此处进行。但是我们只想无改变地将它写回,所以没有什么要做的。
要写回数据,我们必须使用 CharsetEncoder 将它转换回字节:
ByteBuffer outputData = encoder.encode( cb );
在转换完成之后,我们就可以将数据写到文件中了。
Code
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;public class UseCharsets
{public static void main( String args[] ) throws Exception { // 指定输入文件和输出文件名称 String inputFile = "samplein.txt"; String outputFile = "sampleout.txt";// 创建 RandomAccessFile 对象,用于读取和写入文件 RandomAccessFile inf = new RandomAccessFile( inputFile, "r" ); RandomAccessFile outf = new RandomAccessFile( outputFile, "rw" ); long inputLength = new File( inputFile ).length();// 获取 FileChannel 对象 FileChannel inc = inf.getChannel(); FileChannel outc = outf.getChannel();// 将文件内容映射到内存缓冲区 MappedByteBuffer inputData = inc.map( FileChannel.MapMode.READ_ONLY, 0, inputLength );// 获取 Latin-1 编码解码器 Charset latin1 = Charset.forName( "ISO-8859-1" ); CharsetDecoder decoder = latin1.newDecoder(); CharsetEncoder encoder = latin1.newEncoder();// 解码内存缓冲区中的数据 CharBuffer cb = decoder.decode( inputData );// 在此处处理字符数据// 编码处理后的字符缓冲区数据 ByteBuffer outputData = encoder.encode( cb );// 将编码后的数据写入文件 outc.write( outputData );// 关闭资源 inf.close(); outf.close(); }
}
这个程序使用 Java NIO 和字符集处理文件。它将一个文件的内容从拉丁编码(ISO-8859-1)转换为 UTF-8 编码,并将转换后的数据写入另一个文件。
主要步骤如下:
- 指定输入文件和输出文件名称。
- 创建 RandomAccessFile 对象,用于读取和写入文件。
- 将文件内容映射到内存缓冲区。
- 获取拉丁 -1 编码解码器。
- 解码内存缓冲区中的数据。
- 在此处处理字符数据(例如,打印解码后的字符串)。
- 编码处理后的字符缓冲区数据。
- 将编码后的数据写入文件。
- 关闭资源。

相关文章:
庖丁解牛:NIO核心概念与机制详解 07 _ 字符集
文章目录 Pre概述编码/解码处理文本的正确方式示例程序Code Pre 庖丁解牛:NIO核心概念与机制详解 01 庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现 庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片 庖丁解牛&…...
ansible的基本安装
目录 一、简介 1.ansible自动化运维人工运维时代 2.自动化运维时代 3.ansible介绍 4.ansible特点 二、ansible实践 1.环境 2.ansible管理安装 3.ansible被管理安装 4.管理方式 5.添加被管理机器的ip 6.ssh密码认证方式管理 三、配置免密登录 1.ansible自带的密码…...
开发仿抖音APP遇到的问题和解决方案
uni-app如何引入阿里矢量库图标/uniapp 中引入 iconfont 文件报错文件查找失败 uni-app如何引入阿里矢量库图标 - 知乎 uniapp 中引入 iconfont 文件报错文件查找失败:‘./iconfont.woff?t1673007495384‘ at App.vue:6_宝马金鞍901的博客-CSDN博客 将课件中的cs…...
手机上玩.NET的两种方式
少见!手机上玩 .NET_哔哩哔哩_bilibili 小米平板敲代码,termux安装dotnet和vscode_哔哩哔哩_bilibili 都是先容器加载linux rootfs,然后安装 linux-arm64 版本的 dotnet 命令行方式运行 dotnet,代码编辑到是可以安装使用 vscode…...
DedeBIZ 管理系统 DedeV6 v6.2.6 社区版 免费授权版
DedeBIZ 系统:开源、安全、高效的 DedeV6 v6.2.6 社区版 DedeBIZ 系统是基于 PHP 7 版本开发的,具有强大的可扩展性,并且完全开放源代码。它采用现流行的 Go 语言设计开发,不仅拥有简单易用、灵活扩展的特性,还具备更…...
编译 CUDA加速的 OpenCV-4.8.0 版本
文章目录 前言一、编译环境二、前期准备三、CMake编译四、VS编译OpenCV.sln五、问题 前言 由于项目需要用上CUDA加速的OpenCV,编译时也踩了不少坑,所以这里记录一下。 一、编译环境 我的编译环境是: Win10 RTX4050 CUDA-12.0 CUDNN 8.9.…...
设计模式篇---外观模式
文章目录 概念结构实例总结 概念 外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式引入了一个新的外观类,它为多个业务类的调用提供了一个统一的入口。主要优点…...
leetcode:520. 检测大写字母
一、题目: 链接:520. 检测大写字母 - 力扣(LeetCode) 函数原型:bool detectCapitalUse(char* word) 二、思路: 本题较为简单,分为三种情况: 1.首字母大写,其余小写 2.首字…...
5-6求1-20的阶乘和
#include<stdio.h> //求阶乘 int main(){int n;double sum0;//求和:一点一点加int t1;for (n1;n<15;n){tt*n;sumsumt;}printf("结果是:%22.15e \n",sum);return 0; }为啥最后是%22.15e呢? 因为这个求和的结果太大了 所以转…...
web需求记录
需求1:根据后端传过来的设备名:DESKTOP-4DQRGQB,以及mac:e0:be:03:74:40:0b;iQOO-8,mac:b0:33:66:38:c3:25,用web option 是动态增加的(也就是那个选择框里面的东西是根据后端传过来的值动态增加的…...
[网鼎杯 2018]Fakebook
[网鼎杯 2018]Fakebook 打开环境出现一个登录注册的页面 在登录和注册中发现 了地址栏出现变化,扫一波看看 看看robots.txt和flag.php 访问robots.txt看看 再访问user.php.bak <?php class UserInfo { public $name ""; public …...
微信小程序蓝牙连接 uniApp蓝牙连接设备
蓝牙列表期待效果 代码 <template><view class"bluetooth-list"><view class"align-items option" style"justify-content: space-between;" v-for"item in bluetoothList" :key"item.deviceId"><vie…...
启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析
原创/朱季谦 遇到一个很诡异的问题,我在启动多个配置相同zookeeper的Dubbo项目时,其他项目都是正常启动,唯独有一个项目在启动过程中,Dubbo注册zookeeper协议时,竟然出现了这样的异常提示—— Caused by: java.lang.…...
我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)
几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine:使用仿射变换矩阵对图像进行变换,可以实现平移、缩放和旋转等操作。cv2.warpPerspective:使用透视变换矩阵对图像进行透视变换,可以实现镜头校正、图像纠偏等…...
MATLAB算法实战应用案例精讲-【图像处理】图像缩放
目录 前言 知识储备 MATLAB图像处理函数 数字数字图像增强 数字数字图像的变换...
Doris的PROPERTIES与ENGINE(九)
接上篇----------Doris分区与分桶 在建表语句的最后 PROPERTIES 中,可以指定以下两个参数: replication_num 每个 Tablet 的副本数量。默认为 3,建议保持默认即可。在建表语句中,所有 Partition 中的 Tablet 副本数量统一指定。…...
华为云数据库 RDS 下载全量备份文件 wget
地址下载 wget -O FILE_NAME --no-check-certificate "DOWNLOAD_URL"FILE_NAME:重命名,例如mysql1121.qpDOWNLOAD_URL: 地址下载 参考 华为云数据库 RDS 下载全量备份文件...
C#使用whisper.net实现语音识别(语音转文本)
目录 介绍 效果 输出信息 项目 代码 下载 介绍 github地址:https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下载地址:https://huggingface.co/sandrohanea/whisper.net/tree…...
从零开始学习typescript——运算符(算术运算符、赋值运算符、比较运算符)
算术运算符 算术运算符主要是针对数值类型和长整型;包括有加法、减法、乘法、除法、自增、自减等运算 加法() let x:number1let y:number 2console.log(xy)减法(-) let x:number1let y:number 2console.log(y-x)乘法…...
likeshop单商户商城系统 任意文件上传漏洞复现
0x01 产品简介 likeshop单商户标准商城系统适用于B2C、单商户、自营商城场景。完美契合私域流量变现闭环交易使用。 系统拥有丰富的营销玩法,强大的分销能力,支持电子面单和小程序直播等功能。无论运营还是二开都是性价比极高的100%开源商城系统。 0x02…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
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配置的颜色主题,无需引入,直接可…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
