news 2026/5/14 14:50:37

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

作者头像

张小明

前端开发工程师

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/5/13 22:27:51

Windows平台Conda activate报错?Miniconda初始化指南

Windows平台Conda activate报错?Miniconda初始化指南 在人工智能和数据科学项目中,Python 已经成为事实上的标准语言。但随着项目增多,不同任务对 Python 版本、库依赖的要求千差万别——有的需要 PyTorch 1.13,有的必须用 Tensor…

作者头像 李华
网站建设 2026/5/13 11:52:45

requests.post vs 传统方法:效率对比实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个对比测试项目,分别使用:1. requests.post 2. urllib.request 3. http.client 实现相同的POST请求功能。要求:1. 统计各方法的代码行数 2…

作者头像 李华
网站建设 2026/5/13 13:56:52

企业级SSH端口管理实战:从-p参数到安全运维

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个企业SSH端口管理系统,功能包括:1. 批量扫描指定端口范围(-p)的SSH服务 2. 自动生成可视化拓扑图 3. 异常连接告警 4. 合规性检查报告。使用DeepSeek…

作者头像 李华
网站建设 2026/5/13 19:36:14

C#调用FLUX.1-dev模型API:Windows环境下AI集成实践

C#调用FLUX.1-dev模型API:Windows环境下AI集成实践 在当今智能应用快速演进的背景下,越来越多的企业希望将前沿AI能力无缝嵌入现有的业务系统中。尤其是图像生成技术——从一段文字自动生成高质量视觉内容的能力——正逐步被应用于设计辅助、营销素材制作…

作者头像 李华
网站建设 2026/5/10 19:17:48

vLLM推理加速镜像发布:支持LLaMA、Qwen、ChatGLM,吞吐提升10倍

vLLM推理加速镜像发布:支持LLaMA、Qwen、ChatGLM,吞吐提升10倍 在大模型落地如火如荼的今天,一个现实问题始终困扰着AI工程团队:如何让7B、13B甚至更大的语言模型,在有限的GPU资源下稳定支撑成百上千用户的并发请求&am…

作者头像 李华
网站建设 2026/5/12 12:05:34

GHelper终极指南:ROG笔记本性能优化与个性化控制完整教程

还在为华硕官方控制软件的卡顿和复杂操作而头疼吗?GHelper来拯救你的ROG笔记本了!这款轻量级的开源工具专为华硕ROG系列笔记本设计,帮你轻松掌控硬件性能,释放游戏本的真正潜力。 【免费下载链接】g-helper Lightweight Armoury C…

作者头像 李华