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文件写入与编码、字节数组、字符集、字符编解码 一文打通!的更多相关文章

  1. 【java工具类】对字节数组字符串进行Base64解码并生成图片

    import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import org.springfra ...

  2. 将图片文件转化为字节数组字符串,并对其进行Base64编码处理,以及对字节数组字符串进行Base64解码并生成图片

    实际开发中涉及图片上传并且量比较大的时候一般处理方式有三种 1.直接保存到项目中 最老土直接方法,也是最不适用的方法,量大对后期部署很不方便 2.直接保存到指定路径的服务器上.需要时候在获取,这种方式 ...

  3. Java文件编译出现 “编码 GBK 的不可映射字符”

    俗话说,温故而知新.本打算用dos回忆一下基础知识,没想到把自己绊倒了. 用Dos,当然就要回归原始,用记事本啦.下面用一个小练习,演示我遇到的绊脚石.之后,解决了简直笑死. 报错: Java文件编译 ...

  4. JAVA文件写入FileWriter

    JAVA文件写入FileWriter 导包import java.io.FileWriter创建构造方法public FileWrite(String filename),参数是文件的路径及文件名(默 ...

  5. Intellij Idea编译项目下的.java文件时的编码问题

    Intellij Idea编译项目下的.java文件时的编码问题 原创 2015年07月22日 21:45:14 10510 由<编译.java文件时的编码问题>可知,在编译.java文件 ...

  6. String.getBytes()和String.tocharArray(),字节数组和字符数组的区别

    String.getBytes()是将字符串转化为一个字节数组.而String.toCharArray()是将一个字符串转化为一个字符数组. [例如] byte bys[] ="国庆60周年 ...

  7. Java文件写入与读取实例求最大子数组

    出现bug的点:输入数组无限大: 输入的整数,量大: 解决方案:向文件中输入随机数组,大小范围与量都可以控制. 源代码: import java.io.BufferedReader; import j ...

  8. JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流

    上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream  FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...

  9. Java文件写入

    一,FileWritter写入文件 FileWritter, 字符流写入字符到文件.默认情况下,它会使用新的内容取代所有现有的内容,然而,当指定一个true (布尔)值作为FileWritter构造函 ...

  10. Java基础IO类之字节数组流

    package IODemo; //字节数组流 :内部维护这着一个字节数组,我们可以利用流的读取机制来处理字符串 无需关闭,不会报IO异常 // ByteArrayInputstream ByteAr ...

随机推荐

  1. lambdo表达式

    ************************************************************************* 原作者:ioriogami 原文:https://b ...

  2. 什么是FIPS 140-3?

    什么是FIPS 140-3? FIPS 140-3是一项由NIST(National Institute of Standards and Technology)发布的针对加密模块安全要求的标准,英文 ...

  3. 使用Flask和OpenAI构建实时AI聊天应用

    在当今AI技术迅速发展的时代,将AI能力集成到Web应用中已成为一种趋势.本文将分享我如何使用Flask框架和OpenAI API构建一个实时聊天应用,让用户可以与AI助手"Melon&qu ...

  4. QRSuperResolutionNet:一种结构感知与识别增强的二维码图像超分辨率网络(附代码解析)

    QRSuperResolutionNet:一种结构感知与识别增强的二维码图像超分辨率网络(附代码解析) 趁着 web开发课程 期末考试前夕,写一篇博客.{{{(>_<)}}} 将我最近所做 ...

  5. FastAPI权限迷宫:RBAC与多层级依赖的魔法通关秘籍

    title: FastAPI权限迷宫:RBAC与多层级依赖的魔法通关秘籍 date: 2025/06/04 21:17:50 updated: 2025/06/04 21:17:50 author: ...

  6. 关于打高版本java,cc6复现

    关于打高版本java,cc6复现 从上一篇的cc1中我们发现他不能作用在jdk_8u71以上的版本,因此;为了解决这个问题,引入了cc6 之所以不能用cc1打高版本,是由于在Java 8u71以后, ...

  7. MySQL事务:工作原理与实用指南

    MySQL事务:工作原理与实用指南 在数据库操作中,事务是保证数据一致性的重要机制.本文将深入探讨 MySQL 事务的特性.隔离级别以及实际应用场景,帮助你更好地理解和使用事务. 一.什么是事务? 事 ...

  8. 详解HarmonyOS NEXT仓颉开发语言中的全局弹窗

    之前分享过仓颉开发语言中的自定义弹窗,那一次的自定义弹窗需要在对应页面先初始化再进行弹出,不是很方便.今天分享一下不依赖页面的全局弹窗. 仓颉提供了全局弹窗模块prompt_action,使用之前先将 ...

  9. [深度学习] 超长文,一篇讲完 NVIDIA Jetson Hello AI World 全部教程(推理 & 训练)

    目录 一.开始 1.1 安装 1.2 sdkmanger 细节介绍 1.2.1 host 和 target 配合 1.2.2 Jetson SDK Components 介绍 二.Hello AI W ...

  10. Elastic学习之旅 (11) .NET 6应用集成ES - 上

    大家好,我是Edison. 上一篇:Logstash数据采集 写在开头 有了前面10篇的基础,我们大概清楚了ES的基本概念和使用(主要是查询),这也是我们作为Developer应该了解的范畴,而至于更 ...