微网站模板制作教程/互联网产品运营

微网站模板制作教程,互联网产品运营,app开发定制公司哪家,深圳市建设厅网站‌一、核心区别‌ ‌特性‌‌字节流‌‌字符流‌‌数据单位‌以字节(8-bit)为单位处理数据(如0xA1)以字符(16-bit Unicode)为单位处理数据(如A, 你)‌基类‌InputStream / OutputSt…

一、核心区别

特性字节流字符流
数据单位字节(8-bit)为单位处理数据(如0xA1字符(16-bit Unicode)为单位处理数据(如'A''你'
基类InputStream / OutputStreamReader / Writer
底层依赖直接操作原始字节,不涉及编码转换基于字节流实现,自动处理字符编码(如UTF-8、GBK)
典型实现类FileInputStream / FileOutputStreamFileReader / FileWriter

二、使用场景差异

1. 字节流的适用场景

字节流直接操作原始字节,适合处理‌二进制数据‌或‌不涉及字符编码的数据‌:

  • 二进制文件‌:如图片(jpgpng)、音频(mp3)、视频(mp4)等。
  • 网络传输‌:通过字节流传输原始数据(如Socket通信)。
  • 加密/压缩数据‌:处理需要保留字节完整性的场景。

示例:复制图片文件(二进制数据)


try (InputStream in = new FileInputStream("input.jpg");OutputStream out = new FileOutputStream("output.jpg")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}
2. 字符流的适用场景

字符流自动处理字符编码,适合处理‌文本数据‌:

  • 文本文件‌:如txtcsvxmljson等。
  • 需要字符编码的场景‌:如读取UTF-8、GBK等编码的文本。
  • 逐行处理文本‌:如BufferedReader.readLine()

示例:读取UTF-8编码的文本文件

try (Reader reader = new InputStreamReader(new FileInputStream("input.txt"), StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(reader)) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}
}

三、关键注意事项

  1. 字符流的编码问题‌:

    • FileReaderFileWriter默认使用平台编码(如Windows的GBK),可能导致乱码。推荐显式指定编码:
      // 使用InputStreamReader指定UTF-8编码
      Reader reader = new InputStreamReader(new FileInputStream("input.txt"), StandardCharsets.UTF_8);
      
  2. 避免混用字节流和字符流‌:

    • 用字符流处理二进制文件(如图片)会导致数据损坏(字符流会尝试将字节解码为字符,可能破坏原始数据)。
  3. 性能优化‌:

    • 无论字节流还是字符流,都应配合缓冲类(如BufferedInputStreamBufferedReader)提升性能。

四、先导结论的总结

场景应选流类型原因
图片、视频、加密数据字节流保留原始字节,避免编码转换破坏数据
中文文本文件字符流自动处理编码,确保正确解析多字节字符
网络传输原始数据字节流直接操作字节,无需字符编码逻辑

选择正确的流类型可以避免数据损坏和乱码问题,同时提高代码可读性和性能。


另一个思考,既然字符流底层也是用字节流实现,为啥我还需要一个字符流,能给我带来啥好处

字符流虽然底层依赖字节流实现,但它的抽象层解决了几个字节流无法直接处理的 ‌核心痛点‌,尤其是在处理文本数据时。以下是字符流存在的核心价值:

一、字符流的核心优势

1. 自动处理字符编码(核心价值)

字节流操作的是原始字节(byte),而字符流操作的是字符(char)。字符流在底层通过 InputStreamReader / OutputStreamWriter ‌自动完成字节与字符的编解码‌,避免了手动处理编码的复杂性。

示例:读取UTF-8文本文件

  • 用字节流实现(需手动处理编码)
try (InputStream in = new FileInputStream("text.txt")) {byte[] bytes = in.readAllBytes();String text = new String(bytes, StandardCharsets.UTF_8); // 需显式指定编码System.out.println(text);
}
  • 用字符流实现(自动处理编码)‌:
try (Reader reader = new InputStreamReader(new FileInputStream("text.txt"), StandardCharsets.UTF_8)) {char[] buffer = new char[1024];int charsRead;while ((charsRead = reader.read(buffer)) != -1) {System.out.print(new String(buffer, 0, charsRead));}
}

优势‌:字符流直接将字节转换为字符,避免开发者手动处理编码,减少代码冗余和错误。

2. 处理多字节字符(如中文)

字符流能正确解析多字节编码(如UTF-8中的中文字符),而字节流可能因拆分字节导致乱码。

示例:UTF-8编码的中文字符“你好”

  • UTF-8编码为6字节:0xE4 0xBD 0xA0 0xE5 0xA5 0xBD
  • 字节流的风险‌:
byte[] buffer = new byte; // 假设缓冲区大小为3字节
in.read(buffer); // 可能只读到前3字节 0xE4 0xBD 0xA0,对应字符“你”
in.read(buffer); // 再读后3字节 0xE5 0xA5 0xBD,对应字符“好”
// 但如果缓冲区大小是4字节,可能拆分为错误的字节序列,导致乱码!

优势‌:字符流内部维护编码状态机,确保多字节字符的完整性,避免手动处理字节拆分。


3. 提供更高层次的文本操作API

字符流提供针对文本的便捷方法,而字节流只能操作原始字节:

  • 逐行读取‌:BufferedReader.readLine()
  • 按字符处理‌:直接读取字符数组(char[])。
  • 格式化写入‌:PrintWriter.printf()

示例:逐行读取文本文件


try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("log.txt"), StandardCharsets.UTF_8))) {String line;while ((line = br.readLine()) != null) { // 直接按行读取System.out.println(line);}
}

优势‌:无需自行实现换行符(\n\r\n)识别逻辑,简化代码。

二、为什么不能直接用字节流替代字符流?

虽然可以通过字节流+手动编码实现字符流的功能,但会遇到以下问题:

  1. 代码冗余‌:每次都需要调用 new String(bytes, charset) 或 String.getBytes(charset)
  2. 容易出错‌:手动处理字节拆分、编码兼容性(如UTF-8与GBK混用)。
  3. 性能损失‌:频繁的字节-字符转换可能降低效率(字符流内部有优化)。

三、字符流的适用场景总结

场景使用字符流的原因
读取/写入文本文件(如.txt自动处理编码,避免乱码
处理用户输入(控制台、表单)直接按字符处理,无需关心底层字节
需要逐行操作文本(如日志解析)提供readLine()等高级API
跨平台文本处理显式指定编码(如UTF-8),确保环境一致性

四、关键结论

字符流的本质是 ‌“字节流 + 编码抽象层”‌,它通过封装以下细节简化开发:

  1. 字符与字节的自动转换‌(编码/解码)。
  2. 多字节字符的完整性处理‌(如UTF-8的3字节字符)。
  3. 提供面向文本的高级API‌(如按行读取)。

使用原则‌:

  • 处理文本数据时,‌优先使用字符流‌(指定明确编码)。
  • 处理二进制数据时,‌必须使用字节流‌。

🎉🎊🥳👏💃🕺✨🎆🎇💥💫🌟🔥💪💯

更多Java面试的技术和方法论文章,点击这里,可以前往“面试谈”专栏探索更多

🎉🎊🥳👏💃🕺✨🎆🎇💥💫🌟🔥💪💯

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

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

相关文章

无人机点对点技术要点分析!

一、技术架构 1. 网络拓扑 Ad-hoc网络:无人机动态组建自组织网络,节点自主协商路由,无需依赖地面基站。 混合架构:部分场景结合中心节点(如指挥站)与P2P网络,兼顾集中调度与分布式协同。 2.…

MQ,RabbitMQ,MQ的好处,RabbitMQ的原理和核心组件,工作模式

1.MQ MQ全称 Message Queue(消息队列),是在消息的传输过程中 保存消息的容器。它是应用程序和应用程序之间的通信方法 1.1 为什么使用MQ 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理&#xff0…

各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写

上一篇下一篇RNN(中集)待编写 代码详解 pytorch 官网主要有两个可调用的模块,分别是 nn.RNNCell 和 nn.RNN ,下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的,只需要将对输入…

深度学习篇---深度学习中的范数

文章目录 前言一、向量范数1.L0范数1.1定义1.2计算式1.3特点1.4应用场景1.4.1特征选择1.4.2压缩感知 2.L1范数(曼哈顿范数)2.1定义2.2计算式2.3特点2.4应用场景2.4.1L1正则化2.4.2鲁棒回归 3.L2范数(欧几里得范数)3.1定义3.2特点3…

星越L_灯光操作使用讲解

目录 1.开启前照灯 2左右转向灯、远近灯 3.auto自动灯光 4.自适应远近灯光 5.后雾灯 6.调节大灯高度 1.开启前照灯 2左右转向灯、远近灯 3.auto自动灯光 系统根据光线自动开启灯光

Stable Diffusion lora训练(一)

一、不同维度的LoRA训练步数建议 2D风格训练 数据规模:建议20-50张高质量图片(分辨率≥10241024),覆盖多角度、多表情的平面风格。步数范围:总步数控制在1000-2000步,公式为 总步数 Repeat Image Epoch …

【一维前缀和与二维前缀和(简单版dp)】

1.前缀和模板 一维前缀和模板 1.暴力解法 要求哪段区间,我就直接遍历那段区间求和。 时间复杂度O(n*q) 2.前缀和 ------ 快速求出数组中某一个连续区间的和。 1)预处理一个前缀和数组 这个前缀和数组设定为dp,dp[i]表示:表示…

植物来源药用天然产物的合成生物学研究进展-文献精读121

植物来源药用天然产物的合成生物学研究进展 摘要 大多数药用天然产物在植物中含量低微,提取分离困难;而且这些化合物一般结构复杂,化学合成难度大,还容易造成环境污染。基于合成生物学技术获得药用天然产物具有绿色环保和可持续发…

JavaScript |(五)DOM简介 | 尚硅谷JavaScript基础实战

学习来源:尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 笔记来源:在这位大佬的基础上添加了一些东西,欢迎大家支持原创,大佬太棒了:JavaScript |(五)DOM简介 | 尚硅谷JavaScript基础…

The Illustrated Stable Diffusion

The Illustrated Stable Diffusion 1. The components of Stable Diffusion1.1. Image information creator1.2. Image Decoder 2. What is Diffusion anyway?2.1. How does Diffusion work?2.2. Painting images by removing noise 3. Speed Boost: Diffusion on compressed…

yarn 装包时 package里包含sqlite3@5.0.2报错

yarn 装包时 package里包含sqlite35.0.2报错 解决方案: 第一步: 删除package.json里的sqlite35.0.2 第二步: 装包,或者增加其他的npm包 第三步: 在package.json里增加sqlite35.0.2,并运行yarn装包 此…

buu-bjdctf_2020_babystack2-好久不见51

整数溢出漏洞 将nbytes设置为-1就会回绕,变成超大整数 从而实现栈溢出漏洞 环境有问题 from pwn import *# 连接到远程服务器 p remote("node5.buuoj.cn", 28526)# 定义后门地址 backdoor 0x400726# 发送初始输入 p.sendlineafter(b"your name…

DHCP 配置

​ 最近发现,自己使用虚拟机建立的集群,在断电关机或者关机一段时间后,集群之间的链接散了,并且节点自身的 IP 也发生了变化,发现是 DHCP 的问题,这里记录一下。 DHCP ​ DHCP(Dynamic Host C…

股指期货合约的命名规则是怎样的?

股指期货合约的命名规则其实很简单,主要由两部分组成:合约代码和到期月份。 股指期货合约4个字母数字背后的秘密 股指期货合约一般来说都是由字母和数字来组合的,包含了品种代码和到期的时间,下面我们具体来看看。 咱们以“IF23…

OSPF 协议详解:从概念原理到配置实践的全网互通实现

什么是OSPF OSPF(开放最短路径优先)是由IETF开发的基于链路状态的自治系统内部路由协议,用来代替存在一些问题的RIP协议。与距离矢量协议不同,链路状态路由协议关心网络中链路活接口的状态(包括UP、DOWN、IP地址、掩码…

蓝桥杯 之 数论

文章目录 习题质数找素数 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数,质因数,最大公约数,最小公倍数等等 素…

Beans模块之工厂模块注解模块@Qualifier

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

C# HTTP 文件上传、下载服务器

程序需要管理员权限,vs需要管理员打开 首次运行需要执行以下命令注册URL(管理员命令行) netsh advfirewall firewall add rule name"FileShare" dirin actionallow protocolTCP localport8000 ipconfig | findstr "IPv4&quo…

FPGA中串行执行方式之计数器控制

FPGA中串行执行方式之计数器控制 使用计数器控制的方式实现状态机是一种简单且直观的方法。它通过计数器的值来控制状态的变化,从而实现顺序逻辑。计数器的方式特别适合状态较少且状态转移是固定的场景。 基本原理 计数器控制的状态机 ​例程1:简单的顺序状态机 以下是一个…

纯vue手写流程组件

前言 网上有很多的vue的流程组件,但是本人不喜欢很多冗余的代码,喜欢动手敲代码;刚开始写的时候,确实没法下笔,最后一层一层剥离,总算实现了;大家可以参考我写的代码,可以拿过去定制…