当前位置: 首页 > news >正文

Java基础——字节流和字符流

字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。

为什么要有字符流?

Java中字符是采用Unicode标准,Unicode 编码中,一个英文字母或一个中文汉字为两个字节。

而在UTF-8编码中,一个中文字符是3个字节。

那么问题来了,如果使用字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题,一旦将一个字符对应的字节分裂开来,就会出现乱码了。为了更方便地处理中文这些字符,Java就推出了字符流。

字节流

字节流在Java中是以字节为基本单位进行数据的读写操作。它们是最基本的输入输出流,所有字节流的超类是`InputStream`和`OutputStream`。字节流可以处理任何类型的文件,包括文本文件和二进制文件,如图片、音频和视频。由于它们直接操作字节,所以不会涉及到字符编码的问题。字节流不自带缓冲机制,因此每次读写都是直接与文件系统交互,这在处理大量数据时可能会导致效率较低。在Java中,常见的字节流类包括`FileInputStream`、`FileOutputStream`、`BufferedInputStream`和`BufferedOutputStream`。

字符流

字符流在Java中是以字符为基本单位进行数据的读写操作。字符流的超类是`Reader`和`Writer`,它们专门用于处理文本数据。字符流在读写过程中会涉及到字符编码和解码,因此可以避免因编码不一致导致的乱码问题。字符流自带缓冲机制,通过内部的缓冲区可以提高读写效率,特别是在频繁进行读写操作时。字符流适合处理文本文件,因为它们可以保证字符的正确性和完整性。在Java中,常见的字符流类包括`FileReader`、`FileWriter`、`BufferedReader`和`BufferedWriter`。此外,还有转换流`InputStreamReader`和`OutputStreamWriter`,它们可以将字节流转换为字符流,或反之,同时进行必要的编码转换。

总结

字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。
字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。

字节流在操作的时候本身是不会用到缓冲区的,是与文件本身直接操作的,所以字节流在操作文件时,即使不关闭资源,文件也能输出;字符流在操作的时候是使用到缓冲区的。如果字符流不调用close或flush方法,则不会输出任何内容。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 韦唯出席平遥国际电影展开幕式 中英文歌曲连唱尽显国际范
  • 国内可以使用 ChatGPT 吗?为什么? ChatGPT镜像集合
  • 一步一步优化一套生成式语言模型系统
  • 在线PDF转图片怎么转?4种简单转换的方法分享
  • ATTCK实战系列-Vulnstack靶场内网域渗透(二)
  • DK5V100R15VL 贴片12V3.4A同步整流芯片
  • 「芯片知识」MP3解码ic方案,音乐芯片在数字音频中的作用
  • 全新热门电商API接口,实现闲鱼商品详细搜索功能
  • 快递智能地址解析API接口代码
  • vmware 里 centos7 扩展 /dev/mapper/centos-root 容量
  • 【YashanDB知识库】查询YashanDB表空间使用率
  • YUM降级基本用法
  • vsftpd创建ftp用户
  • 计算机毕业设计非遗项目网站 登录注册搜索 评论留言资讯 前后台管理/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
  • NXP实战笔记(十六):NXP 32K3xx系列单片机有关OTA升级的思考
  • (三)从jvm层面了解线程的启动和停止
  • 【刷算法】从上往下打印二叉树
  • ES6之路之模块详解
  • Flannel解读
  • java取消线程实例
  • jquery ajax学习笔记
  • Laravel 中的一个后期静态绑定
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python利用正则抓取网页内容保存到本地
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • springboot_database项目介绍
  • Spring核心 Bean的高级装配
  • vue总结
  • 程序员最讨厌的9句话,你可有补充?
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于webpack 的 vue 多页架构
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 那些被忽略的 JavaScript 数组方法细节
  • 前嗅ForeSpider教程:创建模板
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 深度学习入门:10门免费线上课程推荐
  • ​MySQL主从复制一致性检测
  • ​水经微图Web1.5.0版即将上线
  • ​用户画像从0到100的构建思路
  • !$boo在php中什么意思,php前戏
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • %check_box% in rails :coditions={:has_many , :through}
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)Nginx简介和安装教程
  • (55)MOS管专题--->(10)MOS管的封装
  • (C++20) consteval立即函数
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (论文阅读30/100)Convolutional Pose Machines
  • (三)elasticsearch 源码之启动流程分析
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (已解决)报错:Could not load the Qt platform plugin “xcb“