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

article/2025/9/17 17:59:15

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://chatgpt.dhexx.cn/article/CD6lMhPy.shtml

相关文章

Java:字符流

字符流的底层其实就是字节流。 字符流字节流字符集 结构体系: 1.特点 输入流:一次读一个字节,遇到中文时,一次读多个字节。 输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中。 2.使用场景 对于纯文本…

java的字符流

字符流的底层也是字节流。字符流字节流字符集。 特点是输入流一次读一个字节,遇到中文时,一次读多个字节(读多少个与字符集有关);输出流底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中。 字…

java字符流

前言 输入流:把数据(键盘输入、鼠标、扫描仪等等外设设备)读入到内存(程序)中 输出流:把内存(程序)中的数据输出到外设或其他地方,从文件角度简单总结就是,输…

字符流

3.字符流 3.1为什么会出现字符流 由于字节流操作中文不是特别方便,所以Java就提供了字符流 字符流字节流编码表 用字节流复制文本时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文&#xff0c…

字符流(字符输入流和字符输出流)

概述 当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文…

2、字符流详解

文章目录 一、字符流 (也叫转换流)1、字符输出流:Writer2、字符输入流:Reader3、字符输入流和字符输出流的简化版本4、字符缓冲流 一、字符流 (也叫转换流) 文件字符流 字符流的两个抽象父类:字符输出流:Writer 和字符输入流&…

渗透测试中的LLMNR/NBT-NS欺骗攻击

简介 LLMNR&NBT-NS 欺骗攻击是一种经典的内部网络攻击,然而由于一方面了解它的人很少,另一方面在Windows中它们是默认启用的,所以该攻击到现在仍然是有效的。在本文中,我们首先为读者解释什么是LLMNR&NBT…

如何避免LLMNR / NBT-NS欺骗攻击?

当DNS名称解析时,链路本地多播名称解析(LLMNR)和NetBIOS名称注册和解析服务(NBT-NS)会负责查找网络中所请求的主机地址。 在DNS服务器请求失败时,请求方会在整个网络中进行广播,查找所请求的主…

Active Directory 101 - LLMNR

This is the first article of my Active Directory Series. I’ll be reading through materials and try to explain the key concepts in AD and AD penetration test. Let’s cut directly to it. The Concept References: RFC from IETFLLMNR WikipediaHow LLMNR Work…

内网渗透技术之超越LLMNR/NBNS欺骗的ADIDNS欺骗攻击

利用名称解析协议中的缺陷进行内网渗透是执行中间人(MITM)攻击的常用技术。有两个特别容易受到攻击的名称解析协议分别是链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBNS)。攻击者可以利用这两种协议来…

利用 LLMNR 名称解析缺陷劫持内网指定主机会话

导读本文将会对 LLMNR 协议进行分析并用 python 实现质询和应答。后半部分则会重点阐述利用 LLMNR 在名称解析过程中的缺陷进行实战攻击的部分思路。 0x00 LLMNR 简介 从 Windows Vista 起,Windows 操作系统开始支持一种新的名称解析协议 —— LLMNR,主要…

LLMNR协议

LLMNR协议 http://en.wikipedia.org/wiki/Link-local_Multicast_Name_Resolution The Link Local Multicast Name Resolution (LLMNR) is a protocol based on the Domain Name System (DNS) packet format that allows both IPv4 and IPv6 hosts to perform name resolutio…

组播风暴引起的路由系统重启(LLMNR协议)

网络拓扑 一台路由设备连接可以上网的上级,连接方式DHCP,一台中继器,2.4G和5G同时中继到路由设备(双频中继之后,优先走5G),一台chromecast播放视频,一台ipad连接,一台网络摄像头连接…

内网渗透研究:LLMNR和NetBIOS欺骗攻击分析

目录 基础知识 LLMNR是什么? LLMNR 的工作过程 NetBIOS是什么? Windows系统名称解析顺序 LLMNR和NetBIOS欺骗攻击 攻击原理 Responder工具利用过程 针对LLMNR和NetBIOS欺骗攻击的防御 基础知识 LLMNR是什么? 链路本地多播名称解析&…

LLMNR和NetBIOS欺骗攻击分析及防范

本文首发于先知社区:https://xz.aliyun.com/t/9714 链路本地多播名称解析(LLMNR)是一个基于域名系统(DNS)数据包格式的协议,IPv4和IPv6的主机可以通过此协议对同一本地链路上的主机执行名称解析。 在DNS …

llmnr协议 名称解析缺陷劫持内网指定主机会话

目录 0x00 LLMNR 简介 0x01 LLMNR 协议分析 0x02 LLMNR 名称解析过程 0x03 编程实现 LLMNR 的质询和应答 0x04 LLMNR Poison 攻击原理 0x05 利用伪造源 IP LLMNR Poisone 劫持内网指定主机会话 0x06 LLMNR Poison 实战攻击思路 0x07 总结 0x00 LLMNR 简介 从 Windows …

NetBIOS名称欺骗和LLMNR欺骗

本文原创作者: 贺兰山缺口 原创投稿详情:重金悬赏 | 合天原创投稿等你来! NetBIOS和LLMNR简介 NetBIOS和Link-LocalMulticast NameResolution(LLMNR)是Microsoft针对工作组和域设计的名称解析协议,主要用于…

【内网学习笔记】18、LLMNR 和 NetBIOS 欺骗攻击

0、前言 如果已经进入目标网络,但是没有获得凭证,可以使用 LLMNR 和 NetBIOS 欺骗攻击对目标进行无凭证条件下的权限获取。 1、基本概念 LLMNR 本地链路多播名称解析(LLMNR)是一种域名系统数据包格式,当局域网中的…

LLMNR Poison技术详解

一、LLMNR 协议 简介 从 Windows Vista 起,Windows 操作系统开始支持一种新的名称解析协议 —— LLMNR,主要用于局域网中的名称解析。LLMNR 能够很好的支持 IPv4 和 IPv6,因此在 Windows 名称解析顺序中是一个仅次于 DNS 的名称解析方式&am…

最简单的动态数据源配置

动态数据源配置 操作步骤:一、数据源配置配置方式:二、动态数据源相关类1. 枚举类定义如下:2. 重写查找当前数据源的方法:3. 用ThreadLocal变量存储查询数据源的字符串:4. 用动态数据源替换掉普通的数据源 二、测试结果。1. Mapper类2.TestMapper 二、重点来了!! 操作步骤: 提…