Java 字节流与字符流

news/2025/11/17 2:00:42/文章来源:https://www.cnblogs.com/SutsuharaYuki/p/19229709

核心概念

在Java I/O体系中,流(Stream)是数据传输的抽象。根据处理数据单位的不同,它们被分为两大类:

  1. 字节流:用于处理二进制数据,以字节(8位)为基本单位。

  2. 字符流:用于处理文本数据,以字符(16位Unicode)为基本单位。


1. 字节流

  • 核心抽象类:InputStream 和 OutputStream

  • 处理单位:字节(byte,8位)。

  • 用途:可以用来处理任何类型的数据,因为所有文件(图片、视频、可执行程序、文本文件等)在底层都是以字节形式存储的。

  • 特点:

    • 原始数据:它不关心数据的含义,只是原样读取和写入字节。

    • 通用性强:万能工具,什么都能处理。

    • 处理文本可能出错:如果用它来读取文本(尤其是包含多字节字符的,如中文),可能会因为编码问题导致乱码。

常见子类举例:

  • FileInputStream / FileOutputStream:用于读写文件。

  • ByteArrayInputStream / ByteArrayOutputStream:用于在内存中读写数据。

  • BufferedInputStream / BufferedOutputStream:提供缓冲功能,提高读写效率。

简单示例(读取一个文件的所有字节):

try (FileInputStream fis = new FileInputStream("image.jpg")) {int byteData;while ((byteData = fis.read()) != -1) {// 处理每一个字节 byteData
    }
} catch (IOException e) {e.printStackTrace();
}

2. 字符流

  • 核心抽象类:Reader 和 Writer

  • 处理单位:字符(char,16位)。

  • 用途:专门为处理文本数据而设计。它能自动处理字符编码(如UTF-8, GBK等),确保正确地将字节序列转换为字符,反之亦然。

  • 特点:

    • 高层抽象:它理解“字符”的概念,屏蔽了底层字节编码的复杂性。

    • 自动编码转换:在读取时,它将字节根据指定的字符集解码成字符;在写入时,它将字符编码成字节。默认使用系统的字符编码,但可以指定。

    • 处理文本更方便、安全:是处理纯文本文件的首选。

常见子类举例:

  • InputStreamReader / OutputStreamWriter:桥梁作用,可以将字节流转换为字符流,并指定字符集。

  • FileReader / FileWriter:用于读写文本文件(是InputStreamReaderFileInputStream的组合的便捷类)。

  • BufferedReader / BufferedWriter:提供缓冲功能,并且BufferedReaderreadLine()方法,可以方便地按行读取。

简单示例(按行读取一个文本文件):

try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {String line;while ((line = br.readLine()) != null) {// 处理每一行文本 line
    }
} catch (IOException e) {e.printStackTrace();
}

核心区别与联系

特性字节流字符流
基本单位 字节(8位) 字符(16位Unicode)
处理数据类型 所有二进制数据(如图片、音频、视频等) 文本数据
核心抽象类 InputStreamOutputStream ReaderWriter
是否处理编码 否,直接操作字节 是,依赖字符编码进行转换
性能 处理非文本数据效率高 处理文本数据效率高且安全
关系 底层基础 基于字节流构建,通过InputStreamReader/OutputStreamWriter进行转换

如何选择?

  1. 处理非文本文件(如图片、压缩包、PDF):使用字节流。

  2. 处理文本文件(如.txt, .java, .html):优先使用字符流,特别是BufferedReaderBufferedWriter,因为它们能避免乱码问题,并且提供了更方便的API(如readLine)。

 
 
 

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

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

相关文章

基于ADMM交替方向乘子法的超大规模储备系统分布式协同优化算法收敛性matlab仿真与分析

1.课题概述基于ADMM交替方向乘子法的超大规模储备系统分布式协同优化算法收敛性matlab仿真与分析。为了验证算法在超大规模储能系统中应用的可行性,在一个由10/21个子储能系统构建的仿真环境下进行测试分析。 2.系统仿…

安卓助手

下载 这个我觉得比较重要,所以放到最前 百度网盘:https://pan.baidu.com/s/1mK6__ga1PVC6iUCJCna6Xw?pwd=9jb2 前言 一款用来对APK的解包、打包和签名(未来可能会开发出更多功能)的电脑版软件。 以前名字叫做 长安…

MySQL 查询优化器

控制查询计划 https://dev.mysql.com/doc/refman/8.4/en/controlling-query-plan-evaluation.html 在执行SQL前会根据优化器选择执行计划。而查询优化器的任务是找到执行SQL查询的最佳计划。MySQL的查询优化器会在所有…

精读GitHub - swift-markdown-ui

精读GitHub - swift-markdown-ui一、项目介绍项目地址:https://github.com/gonzalezreal/swift-markdown-uiswift-markdown-ui (也称为 MarkdownUI) 是一个用于在 SwiftUI 中显示和自定义 Markdown 文本的开源库。 …

Bash的快捷键

Bash的快捷键 光标移动 快捷键 描述Ctrl + a 移动光标到行首Ctrl + e 移动光标到行尾Alt + b 移动光标后退一个单词(词首)Alt + f 移动光标前进一个单词(词首)Ctrl + f 光标前进一个字母Ctrl + b 光标…

C++学习日志——蓝桥杯课程总结_基础篇/2025.11.16

C++学习日志 在了解C语言的相关知识后,我想进一步的了解C++的相关知识,借助此次蓝桥杯课程机会,简单记录一下我认为有趣的知识点,重点揭示C++在用法上和C语言的不同之处。希望可以为我,同时也给各位读者的学习供一…

从概念迷宫到行动共生:价值原语化与全球行为接口协议新范式

从概念迷宫到行动共生:价值原语化与全球行为接口协议新范式 岐金兰 2025年11月17日 摘要: 当抽象的价值概念陷入无休止的语义之争,全球对话与人工智能的价值对齐便举步维艰。本文提出并系统论述了“价值原语化”理论…

【Linux】curl基础语法与常用参数详解

【Linux】curl基础语法与常用参数详解一、curl基础语法与常用参数详解 1. 基础请求结构 curl [选项] <URL>示例:发送GET请求并打印响应头与体 curl -v https://api.example.com/data-v:显示详细请求/响应日志(…

Linux系统编程初步——冯诺依曼体系结构的理解

系统编程和网络编程初步 学习 Linux 是为了在 Linux 下进行系统级别和网络级别的编程。Linux 只是操作系统的代表,其他的 Windows、MacOS等也可以进行类似的编程模式,Linux 因为开源,内核源码公开,所以从 Linux 入…

2025-11-17 使用nvm下载node包失败

PS C:\project> nvm install node 25.2.0 Downloading node.js version 25.2.0 (64-bit)... Error while downloading https://nodejs.org/dist/v25.2.0/node-v25.2.0-win-x64.zip - read tcp [2409:8a55:43:5be0:8…

2. 使用Gin处理HTTP请求

2. 使用Gin处理HTTP请求 2.1 Gin路由Gin的路由负责将传入的请求路径映射到相应的处理函数上。处理函数是处理请求并生成响应的核心部分,通常被定义为func(c *gin.Context),其中c提供了对请求和响应的访问接口。通过路…

C++之复合类型(四) - Invinc

本文记录了C++中与复合类型相关的容易遗忘的一些知识。本文记录了C++中与复合类型相关的容易遗忘的一些知识。内置数组 初始化 只有在定义数组时才能使用初始化形式。之后不能使用,也不能将一个数组整体赋值给另一个数…

20232414 2025-2026-1 《网络与系统攻防技术》实验五实验报告

20232414 2025-2026-1 《网络与系统攻防技术》实验五实验报告 1.实验内容 总结一下本周学习内容,不要复制粘贴 2.实验过程 3.问题及解决方案问题1:XXXXXX 问题1解决方案:XXXXXX 问题2:XXXXXX 问题2解决方案:XXXXX…

物流管理,必须掌握的10个要点 - 智慧园区

一说到物流,就很容易出现这些情况—— 老板说库存不是积压就是缺货,成本一直居高不下; 员工说部门之间信息不透明,这个说没收到订单,那个说以及发货但是没显示; 客户说一直看不到货物配送状态,都不知道到底发没…

工程行业中-使用AI报价得可行性-一般(属于能应付但不精确,未测试在数据库全得情况下得效果,总体欠调教)

起因 事件起因是之前答应朋友测试ai造价(假)得可行性,然后我就问了我朋友要了份文件思路 总体思路是使用csv文件去进行读写,所以首先就是将需要报价得表格转为为csv格式,有些ai可以直接读写excel,不过建议输出还…

41

所学时间:9小时

VB6介绍

VB6介绍Posted on 2025-11-17 00:00 lzhdim 阅读(0) 评论(0) 收藏 举报 Austin Liu 刘恒辉 ProjectManager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢…

力扣 第 476 场周赛(A~D)

力扣 第 476 场周赛(A~D)$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");A:3745. 三元素表达式的最大值签到题,直接排序,首尾分别取两个和一个就可以了。1…

libvte, xfce4-terminal和gnome-terminal,干货满满

GTK+是GNOME桌面环境的核心图形库‌‌,它俩的关系像GDI和Windows的关系(不讨论GDI+和WPF)。 GTK+(GIMP Toolkit)最初是为GIMP图像处理软件开发的。 VTE,即Virtual TErminal widget,是GTK+的一部分。widget像Win…