Java文件写入与编码、字节数组、字符集、字符编解码 一文打通!
1. 编码操作和解码操作
编码操作是把字符串映射为一组byte序列。以何种方式映射?比如把“你”映射为00000000还是11111111?这是由编码集决定的。
常见的字符编码集如UTF-8、GBK等。
解码操作是把一组byte映射为字符串。同理根据编码集就可以进行解码操作。这是一个互逆的过程。
类似于谍战片中的情报,写在纸上的是加密内容(byte序列),当接头人拿到情报后通过密码本(编码集),解出真正的内容。
2. 案例
现在提出一个需求,你来编写一个Java接口。
实现接收一个网络请求,请求包含一个字符串参数,你把这个字符串保存到C盘为a.txt文档。
这个过程设计到哪些编码和解码,是如何进行的?。
因为上层网络传输以byte为单位传输。
首先浏览器发送http请求时会把字符串参数“你好”根据编码方式(如UTF-8)编码为byte数组[0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD],从网络中传输。
当后端接收到请求后由Spring MVC框架会自动读取参数byte数组,默认按照UTF-8编码进行解码(版本不同解码时默认编码方式可能不同),创建一个String对象。
现在我们把字符串写到本地文件a.txt.
要知道文件存储同样是二进制,因此需要把字符串转为byte数组。
把byte数组写到本地磁盘,这个过程就完成了。
可能有的同学会有疑问?写入的a.txt文件你说是byte数组,但是我看到的是字符串呀!
你看到的是字符串,这是因为你打开文本使用的软件会读取byte序列,按照系统编码方式(可能是UTF-8、可能是GBK可以设置)进行编码后呈现给你的。
相信你通过电脑记事本打开有些文件,一定见过乱码吧。出现乱码的原因是通过某种编码方式写入磁盘的byte数组,它与记事本软件打开文本时使用的编码方式不一致。
这就是我们常说的编码不一致的问题。
Java中String默认编码是UTF-16是怎么回事?
这里说的String默认编码是指String字符串在内存中的编码方式。String对象在内存中始终使用UTF-16编码。也就是说,无论原始字节是何种编码(UTF-8、GBK等),一旦被转换成String,它就会以UTF-16编码的形式存储在内存中。
字符集和字符编码
Unicode是字符集。Unicode 为全球几乎所有字符(文字、符号、表情等)分配了唯一的数字编号(称为 “码点”,格式为 U+XXXX),例如 U+0061 代表小写字母 “a”,U+4E2D 代表汉字 “中”。它只定义了字符与码点的对应关系,不涉及存储或传输的具体方式。
UTF-8 是 “Unicode 转换格式”(Unicode Transformation Format)的一种,它规定了如何将 Unicode 码点转换为计算机可存储的二进制字节序列。
个人水平有限,如有错误还请各位大佬指正
Java文件写入与编码、字节数组、字符集、字符编解码 一文打通!的更多相关文章
- 【java工具类】对字节数组字符串进行Base64解码并生成图片
import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import org.springfra ...
- 将图片文件转化为字节数组字符串,并对其进行Base64编码处理,以及对字节数组字符串进行Base64解码并生成图片
实际开发中涉及图片上传并且量比较大的时候一般处理方式有三种 1.直接保存到项目中 最老土直接方法,也是最不适用的方法,量大对后期部署很不方便 2.直接保存到指定路径的服务器上.需要时候在获取,这种方式 ...
- Java文件编译出现 “编码 GBK 的不可映射字符”
俗话说,温故而知新.本打算用dos回忆一下基础知识,没想到把自己绊倒了. 用Dos,当然就要回归原始,用记事本啦.下面用一个小练习,演示我遇到的绊脚石.之后,解决了简直笑死. 报错: Java文件编译 ...
- JAVA文件写入FileWriter
JAVA文件写入FileWriter 导包import java.io.FileWriter创建构造方法public FileWrite(String filename),参数是文件的路径及文件名(默 ...
- Intellij Idea编译项目下的.java文件时的编码问题
Intellij Idea编译项目下的.java文件时的编码问题 原创 2015年07月22日 21:45:14 10510 由<编译.java文件时的编码问题>可知,在编译.java文件 ...
- String.getBytes()和String.tocharArray(),字节数组和字符数组的区别
String.getBytes()是将字符串转化为一个字节数组.而String.toCharArray()是将一个字符串转化为一个字符数组. [例如] byte bys[] ="国庆60周年 ...
- Java文件写入与读取实例求最大子数组
出现bug的点:输入数组无限大: 输入的整数,量大: 解决方案:向文件中输入随机数组,大小范围与量都可以控制. 源代码: import java.io.BufferedReader; import j ...
- JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流
上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...
- Java文件写入
一,FileWritter写入文件 FileWritter, 字符流写入字符到文件.默认情况下,它会使用新的内容取代所有现有的内容,然而,当指定一个true (布尔)值作为FileWritter构造函 ...
- Java基础IO类之字节数组流
package IODemo; //字节数组流 :内部维护这着一个字节数组,我们可以利用流的读取机制来处理字符串 无需关闭,不会报IO异常 // ByteArrayInputstream ByteAr ...
随机推荐
- lambdo表达式
************************************************************************* 原作者:ioriogami 原文:https://b ...
- 什么是FIPS 140-3?
什么是FIPS 140-3? FIPS 140-3是一项由NIST(National Institute of Standards and Technology)发布的针对加密模块安全要求的标准,英文 ...
- 使用Flask和OpenAI构建实时AI聊天应用
在当今AI技术迅速发展的时代,将AI能力集成到Web应用中已成为一种趋势.本文将分享我如何使用Flask框架和OpenAI API构建一个实时聊天应用,让用户可以与AI助手"Melon&qu ...
- QRSuperResolutionNet:一种结构感知与识别增强的二维码图像超分辨率网络(附代码解析)
QRSuperResolutionNet:一种结构感知与识别增强的二维码图像超分辨率网络(附代码解析) 趁着 web开发课程 期末考试前夕,写一篇博客.{{{(>_<)}}} 将我最近所做 ...
- FastAPI权限迷宫:RBAC与多层级依赖的魔法通关秘籍
title: FastAPI权限迷宫:RBAC与多层级依赖的魔法通关秘籍 date: 2025/06/04 21:17:50 updated: 2025/06/04 21:17:50 author: ...
- 关于打高版本java,cc6复现
关于打高版本java,cc6复现 从上一篇的cc1中我们发现他不能作用在jdk_8u71以上的版本,因此;为了解决这个问题,引入了cc6 之所以不能用cc1打高版本,是由于在Java 8u71以后, ...
- MySQL事务:工作原理与实用指南
MySQL事务:工作原理与实用指南 在数据库操作中,事务是保证数据一致性的重要机制.本文将深入探讨 MySQL 事务的特性.隔离级别以及实际应用场景,帮助你更好地理解和使用事务. 一.什么是事务? 事 ...
- 详解HarmonyOS NEXT仓颉开发语言中的全局弹窗
之前分享过仓颉开发语言中的自定义弹窗,那一次的自定义弹窗需要在对应页面先初始化再进行弹出,不是很方便.今天分享一下不依赖页面的全局弹窗. 仓颉提供了全局弹窗模块prompt_action,使用之前先将 ...
- [深度学习] 超长文,一篇讲完 NVIDIA Jetson Hello AI World 全部教程(推理 & 训练)
目录 一.开始 1.1 安装 1.2 sdkmanger 细节介绍 1.2.1 host 和 target 配合 1.2.2 Jetson SDK Components 介绍 二.Hello AI W ...
- Elastic学习之旅 (11) .NET 6应用集成ES - 上
大家好,我是Edison. 上一篇:Logstash数据采集 写在开头 有了前面10篇的基础,我们大概清楚了ES的基本概念和使用(主要是查询),这也是我们作为Developer应该了解的范畴,而至于更 ...