news 2026/4/28 14:32:07

一口气解释清楚转换流存在的原因

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一口气解释清楚转换流存在的原因

本文从为什么发明转换流,什么时候用转换流这个角度来解释
博主在学习io流的时候就对这两个点疑惑,如果你也这样可以跟随我的视角来理解

转换流的作用 (字面意思:字节流和字符流的转换)

  • 解码过程:字节流→指定编码→字符流
  • 编码过程:字符流→指定编码→字节流

代码案例

  • 功能1:指定一定的编码格式来进行读取和写入
  • 示例一:将一个GBK的本地文件转换成(UTF-8)文件

1:用普通字符流操作代码:

Filefile=newFile("D:\\包\\gbk.txt");Filefile1=newFile("D:\\包\\utf-8.txt");//Java 中 FileReader 和 FileWriter 是简化版字符流,不支持直接指定编码(这两个类会使用系统默认编码,无法手动传编码参数)!FileReaderfi=newFileReader(file);FileWriterfr=newFileWriter(file1);intb;while((b=fi.read())!=-1){fr.write((char)b);}fr.close();fi.close();

用普通字符流FileReader/FileWriter的结果出现乱码:

乱码原因:普通流只能按系统默认的编码格式来进行读取和写入不能指定格式,也就是他读取和写入的编码方式一样的,注定会乱码。

用普通字节流FileInputStream/FileOutputStream是可以完成这个功能的,并且不乱码,这因为字节流和字符流的核心区别就是字节流仅处理「原始字节(8 位二进制数据)」,不涉及任何字符编码转换;而「编码方式」是字符流(Character Stream)特有的概念,本文为了理解转换流的功能所以才将普通字符流来和转换流(也是字符流)来进行对比。

1:用普通字符流操作代码:

//创建数据源Filefile=newFile("D:\\包\\gbk.txt");Filefile1=newFile("D:\\包\\utf-8.txt");//创建管道流FileInputStreamfi=newFileInputStream(file);FileOutputStreamfo=newFileOutputStream(file1);//要指定编码读取 / 写入,用 InputStreamReader(基于字节流 + 编码)和 OutputStreamWriter 替代。InputStreamReaderisr=newInputStreamReader(fi,"GBK");OutputStreamWriterosw=newOutputStreamWriter(fo,"UTF-8");//开始读写操作intb;while((b=isr.read())!=-1){osw.write((char)b);}//关闭资源osw.close();isr.close();

用转换流(高级字符流)InputStreamReader/OutputStreamWriter的结果:

  • 功能2:就是利用字节流读取和输出,但是还想用字符缓冲流的方法(readLine()/newLine()),字节缓冲流并没有这俩功能
  • 示例二:用字节流做基础流但是使用字符缓冲流的功能
    代码演示:
//创建数据源Filefile=newFile("D:\\包\\学生信1息.txt");Filefile1=newFile("D:\\包\\学生信息.txt");//创建管道流FileInputStreamfi=newFileInputStream(file);FileOutputStreamfo=newFileOutputStream(file1);//字节流(如 FileInputStream/FileOutputStream)的核心行为是://读取阶段:从源文件中逐个 / 批量读取二进制字节(比如 GBK 编码的 “中” 是D6 D0两个字节,UTF-8 的 “中” 是E4 B8 AD三个字节),完全不关心这些字节对应什么字符;//写入阶段:把读取到的二进制字节原封不动写入目标文件,字节的顺序、值都没有任何修改。//整个过程就像 “复制粘贴文件的二进制底层数据”—— 源文件的编码是 GBK/UTF-8/GB2312 都无所谓,字节流只负责 “搬字节”,不解析、不转换,目标文件的字节和源文件 100% 一致,自然不会乱码。InputStreamReaderisr=newInputStreamReader(fi);OutputStreamWriterosw=newOutputStreamWriter(fo);BufferedReaderbr=newBufferedReader(isr);BufferedWriterbw=newBufferedWriter(osw);//开始读写操作Stringstr;while((str=br.readLine())!=null){bw.write(str);bw.newLine();//写完一行,换行}//关闭资源bw.close();br.close();
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 7:27:12

Mem Reduct内存管理终极指南:告别卡顿,拥抱流畅体验

Mem Reduct内存管理终极指南:告别卡顿,拥抱流畅体验 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduc…

作者头像 李华
网站建设 2026/4/27 9:05:15

基于高质量数据训练的专业化代码生成模型——Seed-Coder-8B-Base

基于高质量数据训练的专业化代码生成模型——Seed-Coder-8B-Base 在今天的软件开发环境中,开发者每天都在与重复性编码、语法陷阱和团队协作中的风格冲突打交道。尽管通用大语言模型已经能够“写代码”,但它们更像是泛读百书的通才——懂得多&#xff0c…

作者头像 李华
网站建设 2026/4/17 7:26:34

YooAsset实战:大型手游资源管理案例解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个手游资源管理案例演示项目,使用YooAsset实现以下功能:1) 动态加载场景资源 2) AB包依赖管理 3) 热更新流程实现。要求包含完整的项目结构&#xff0…

作者头像 李华
网站建设 2026/4/19 4:50:26

如何用ColorUI选项卡组件解决移动端界面切换难题

如何用ColorUI选项卡组件解决移动端界面切换难题 【免费下载链接】coloruicss 鲜亮的高饱和色彩,专注视觉的小程序组件库 项目地址: https://gitcode.com/gh_mirrors/co/coloruicss 你是否曾经在开发移动端应用时,面对复杂的界面分类需求感到无从…

作者头像 李华
网站建设 2026/4/20 4:06:27

终极指南:Vite-Vue3-Lowcode可视化开发平台如何让前端开发效率飙升500%

终极指南:Vite-Vue3-Lowcode可视化开发平台如何让前端开发效率飙升500% 【免费下载链接】vite-vue3-lowcode vue3.x vite2.x vant element-plus H5移动端低代码平台 lowcode 可视化拖拽 可视化编辑器 visual editor 类似易企秀的H5制作、建站工具、可视化搭建工具…

作者头像 李华