字符流定义及如何深入理解字符流的编码

news2025/1/14 18:08:16

IputSrem类和OupuSrem类在读写文件时操作的都是字节,如果希望在程序中操作字符,使用这两个类就不太方便,为此JDK提供了字符流。同字节流样,字符流也有两个抽象的顶级父类,分别是Reader和Writer其中,Reader是字符入流,用于从某个源设备读取字符;Writer是字符输出流,用于向某个目标设备写入字符。Reader和Writer作为字符流的顶级父类,也有许多子类。下面通过张继承关系图列举Reader和Writer的一些常用子类
在这里插入图片描述
在这里插入图片描述
从中可以看到,字符流的继承关系与字节流的继承关系有些类似,很多子类都是成对(输入流和输出流)出现的,其中PipedReader和FileWriter用于读写,BufferedReader和BufferedWriter是具有缓冲功能的流,使用它们可以提高读写效率。

如何深入理解字符流的编码

Java中是以流的形式来实现数据在网络中的传输,而所说的“流”则是字节流。因为所有的数据的最底层都是以字节为单位存储的,所以以字节为单位传输数据无疑是最简单也是最有效的传输方式。
我们在学习Java的过程中,也经常接触字符流,字符流顾名思义则是以字符为单位进行数据传输,但是其实字符流的应用面是很窄的,并不是所有的文件都存在字符的概念的,比如视频文件、音频文件、图片文件,这些是无法以字符为单位进行传输的。字符流只能对文本字符进行操作。
提到字符,我们首先就会想到的是编码,因为计算机存储的是字节,我们看到的却是字符,这之间是靠编码表对应起来的,那么这也就是本篇文章索要研究的内容—字符流编码。
首先我们来看下面的案例:
在这里插入图片描述
案例显示,Demo.java的项目编码和b.txt的编码格式一样,则能够正常写入,不会乱码。原理如下图所示:
在这里插入图片描述
字符流,每一个字符流都存在一个缓冲区,缓冲区的编码格式是和项目的编码格式一致的,上述代码执行流程是:字符串“黑马”在FileWriter的缓冲区里面通过GBK编码把汉字编码成对应的字节,然后底层通过字节流将字节写入到b.txt。 很多人我们打开b.txt时看到的是“黑马”这两个字啊,并不是什么码值啊。其实所有文件的底层都是字节,子不过我们打开b.txt时,记事本软件就通过此文件的编码—GBK帮我们把码值解码成“黑马”这两个字了,所以我们看到的是黑马。照这样看来,如果b.txt的文件编码是UTF-8的话,肯定就会乱码,因为记事本会按照UTF-8进行解码,效果如下
在这里插入图片描述
接下来难点才真正的来临(很多人看了下面的代码和运行效果就蒙圈),我们把上图的代码改下(其他编码格式不变),你会发现不乱码了,如下图:
在这里插入图片描述
源码如下
在这里插入图片描述
很多人蒙圈的原因是因为,先把字符转为了UTF-8 但是又通过new String(bytes)转成了GBK啊,但是b.txt是UTF-8格式的编码啊。为什么没有乱码呢? 下图解释的很详细:
在这里插入图片描述
执行流程是:先通过UTF-8编码把“黑马”编码成几个字节比如13 42 35 86 59 47,然后再通过GBK编码,把该码值解码成对应的字符比如“传智人”,然后“传智人”进入缓冲区会通过GBK编码编码成刚才的字节 也就是13 42 35 86 59 47,然后再通过字节流写入到b.txt中,当打开b.txt时,记事本软件会按照此文件编码格式-UTF-8解码成“黑马”,所以我们看到的是没有乱码。

总结:通过比价复杂的案例我们明白了一、每个字符流都存在缓冲区,而且缓冲区的编码是和项目编码一致。二、字符流的底层依然是使用的字节流,而且还存在缓冲区的编码动作,所以效率比字节流会慢很多,所以通常数据的传输我们都会使用字节流。三、文本文件的底层存储的也是字节,我们打开文件看到的字符,是记事本软件所做的解码。

Java基础入门:

java零基础自学首Java入门教程(含Java项目和Java真题)

Javaweb核心基础

JavaWeb基础教程,Java web从入门到企业实战完整版

Spring Cloud最全微服务架构

史上最全面的springcloud微服务技术栈

SSM框架教程:

SSM框架教程_Spring+SpringMVC+Maven高级+Spring

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nvidia jetson nano硬件架构

资料来源 官方文档中心 https://developer.nvidia.com/embedded/downloads -> 选jetson -> Jetson Nano Product Design Guide //产品设计指导(入口) //-> 1.1 References 列出了相关的文档 -> Jetson Nano Developer Kit Carrier Board Specification //板子标注…

MySQL实战之深入浅出索引(下)

1.前言 在上一篇文章中,我们介绍了InnoDB索引的数据结构模型,今天我们再继续聊一下跟MySQL索引有关的概念。 在介绍之前,我们先看一个问题: 表初始化语句 mysql> create table T ( ID int primary key, k int NOT NULL DEFA…

LeetCode 1237. Find Positive Integer Solution for a Given Equation【双指针,二分,交互】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

Linux学习--重定向

重定向的意思是&#xff0c;将数据传到其他地方。 符号解释>输出覆盖重定向>>输出追加重定向<或<<标准输入重定向 1、读取文件内容且写入到另一个文件中&#xff0c;覆盖写入文件内容 cat haha.txt > xixi.txt2、追加写入文件内容 cat haha.txt >&g…

2023,年轻人不想买钻石了?

【潮汐商业评论/ 原创】“钻石恒久远&#xff0c;一颗永流传。”很明显&#xff0c;Lily就是这句话的“受害者”。临近婚期的她&#xff0c;在婚戒的选择上犯起了愁&#xff0c;“我现在想到买钻戒&#xff0c;我就头大。买小的凑合一下&#xff0c;耳边传来的都是‘别买一克拉…

Linux命令篇 linux命令大全简洁明了 linux学习笔记

Linux命令篇 linux命令大全简洁明了 linux学习笔记 Linux 命令大全 文章目录Linux 命令大全一、 常用的基础命令查看目录&#xff1a;切换目录&#xff1a;创建和删除&#xff1a;拷贝和移动文件&#xff1a;查看文件内容&#xff1a;其他&#xff1a;小技巧终端命令格式1.1 ls…

如何用3个月零基础入门网络安全?

背景 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a;1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; 一、自学网络安全学习的误区和陷阱 1.不…

基于Conda完成创建多版本python环境

文章目录基于Conda完成创建多版本python环境基于Conda完成创建多版本python环境 通过cmd打开conda环境 d:\ProgramData\Anaconda3\Scripts\activate创建python3.7的环境 conda create -n py3.7 python3.7产生错误 Collecting package metadata (repodata.json): failed Unav…

IEEE14节点系统在如短路分析,潮流研究,互连电网中的研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MIMO信道的稀疏性

一. 介绍 本文章将从“信道冲激响应”的角度解释为什么MIMO信道具有稀疏性&#xff0c;公式较多&#xff0c;需要了解以下先验知识&#xff1a; 信道相干带宽与传输信号带宽 带宽与宽带 平坦衰落与频率选择性衰落 信道冲击响应 基带与射频 多径传输与最大传播时延 基带带宽是信…

6个必知的Mysql索引失效场景,别再踩坑了!

今天我来聊聊索引的相关问题&#xff0c;因为索引是大家都比较关心的公共话题&#xff0c;确实有很多坑。不知道你在实际工作中&#xff0c;有没有遇到过下面的这两种情况&#xff1a;明明在某个字段上加了索引&#xff0c;但实际上并没有生效。索引有时候生效了&#xff0c;有…

Linux字符设备驱动模型之设备号

从上文中可知&#xff0c;在Linux用户空间中&#xff0c;如若需要操作硬件设备&#xff0c;均通过/dev目录下的设备文件节点进行操作&#xff0c;基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中&#xff0c;其表示字符设备的结构成员也提供了相应的设备号…

论文投稿指南——中文核心期刊推荐(外国语言)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【学习】笔记本电脑重新安装系统win10

安装系统有很多方法: 软件安装制作启动u盘本文使用的方法就是启动盘安装: 1.首先下载iso镜像文件: msdn我告诉你:MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn) 2.下载启动盘制作工具: 制作启动盘rufus:Rufus - 轻松创建 USB 启动盘 3.官网下载: https://do…

【设计模式】18.观察者模式

概述 定义&#xff1a; 又被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时&#xff0c;会通知所有的观察者对象&#xff0c;使他们能…

Word控件Spire.Doc 【书签】教程(2):在 C#、VB.NET 中删除书签

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

2023年智能轨道,交通与运输工程国际会议(ICSTTE 2023)

重要信息 会议网址&#xff1a;www.icstte.org 会议时间&#xff1a;2023年7月28-30日 召开地点&#xff1a;长沙 截稿时间&#xff1a;2023年6月20日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;EI,Scopus 会议简介 ★2023年智能轨道&#xff0c;交通与运输工…

UWB到底是什么技术?

什么是空间感知能力 所谓的空间感知能力&#xff0c;就是感知方位的能力。更直接一点&#xff0c;就是定位能力。说白了&#xff0c;利用UWB技术&#xff0c;手机和智能设备可以更精准地实现室内定位&#xff0c;不仅可以感知自己的位置&#xff0c;还可以感知周边其它手机或设…

uniapp小程序日历自定义文案,日期上下滑动方式

1、先展示效果图 2、接下来上代码&#xff0c;样式的话自行修改&#xff08;直接去文件内修改&#xff0c;不影响&#xff09;&#xff0c;将calendar文件下载后导入到自己的components目录下&#xff0c;文件下载放在最后面 <template><view class"calendar-…

全志T3+FPGA国产核心板——Pango Design Suite的FPGA程序加载固化

本文主要基于紫光同创Pango Design Suite(PDS)开发软件,演示FPGA程序的加载、固化,以及程序编译等方法。适用的开发环境为Windows 7/10 64bit。 测试板卡为全志T3+Logos FPGA核心板,它是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计…