news 2026/6/23 18:48:09

IO流(四)高级流——>转换流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IO流(四)高级流——>转换流

(2)转换流

—1、转换流基本用法
转换流

是字符流的子类,是字符流和字节流之间的桥梁,创建转换流对象(InputStreamReader)会包装一个字节流,转换流可以让该字节流变成字符流,让它拥有字符流的特性。比如:可以根据字符集一次读取多个字节,读取数据不会乱码了。而当要拷贝到文件时,创建OutputStremWriter会将字符流再次转换为字节流存入文件。

注:转换流InputStreamReader的父类是Reader,而关键:FileReader字符输入流的父类是转换流,同理输出流也一样
转换流的应用场景

1、指定字符集读写

2、字节流想要使用字符流中的方法

转换流构造方法

//构造1:默认平台编码InputStreamReader(InputStream in)

//构造2:指定编码【重点】InputStreamReader(InputStream in, String charsetName)

底层原理:

—2、转换流练习
(1)将本地文件中的GBK文件,转成UTF-8

JDK11以前必须创建转换流对象,利用转换流指定字符编码读写InputStreamReader isr = new InputStreamReader(new FileInputStream("opp-IO\\Text.txt"),"GBK");这是非常麻烦的,所

而在JDK11以后出现了替代方法

FileReader字符输入流的父类是转换流InputStreamReader,而InputStreamReader在JDK11出现了新的构造方法public InputStreamReader(File file, Charset charset)该方法的第二个参数调用Charset里面的静态方法forName是用来指定字符编码的所以转换流的子类FileReader继承子类构造方法,也可以用这种构造方法

所以要转换本地文件编码类型,不用在创建转换流对象,

FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName("GBK"));

package ConvertStream; import java.io.*; import java.nio.charset.Charset; public class ConvertStreamDemo1 { public static void main(String[] args) throws IOException { /* 利用转换流按照指定字符编码读取(了解即可) 因为有替代方法JDK11以后 */ //1.创建对象并指定字符编码 // InputStreamReader isr = new InputStreamReader(new FileInputStream("opp-IO\\Text.txt"),"GBK"); // //2.读取数据 // int ch; // while ((ch = isr.read()) != -1) { // System.out.print((char)ch); // } // isr.close(); /* JDK11以后得替代方法 FileReader字符输入流的父类是转换流InputStreamReader, 而InputStreamReader在JDK11出现了新的构造方法 public InputStreamReader(File file, Charset charset) 该方法的第二个参数调用Charset里面的静态方法forName是用来指定字符编码的 所以转换流的子类FileReader继承子类构造方法,也可以用这种构造方法 */ FileReader fr = new FileReader("opp-IO\\Text.txt", Charset.forName("GBK")); int ch; while ((ch = fr.read()) != -1) { System.out.print((char)ch); } fr.close(); /* 利用转换流按照指定字符编码写出(旧的方法了解即可) 因为有替代方法 */ // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("opp-IO\\c.txt"),"GBK"); // osw.write("我是帅哥"); // osw.close(); FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName("GBK")); fw.write("我是帅哥"); fw.close(); } }

最终代码

import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.charset.Charset; public class ConvertStreamDemo2 { public static void main(String[] args) throws IOException { /* 将本地文件中的GBK文件,转成UTF-8; */ FileReader fr = new FileReader("opp-IO\\Text.txt", Charset.forName("GBK")); FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName("UTF-8")); int len; char[] chars = new char[1024]; while((len = fr.read(chars)) != -1) { fw.write(chars, 0, len); } fw.close(); fr.close(); } }
(2)用字节流读取文件数据(不能出现乱码)

利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码

//1、字节流在读取中文的时候,是会出现乱码的,但是字符流可以搞定

//2、字节流里面是没有读一整行的方法的,只有字符缓冲流才能搞定

此时可以利用转换流将字节流转成字符流

InputStreamReader(字节输入流,"编码")

OutputStreamWriter(字节输出流,"编码")

转换流 = 字节流 + 编码参数

import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class ConvertStreamDemo3{ public static void main(String[] args) throws IOException { /* 利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码 //1、字节流在读取中文的时候,是会出现乱码的,但是字符流可以搞定 //2、字节流里面是没有读一整行的方法的,只有字符缓冲流才能搞定 */ /*FileInputStream fis = new FileInputStream("opp-IO\\a.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); String str = br.readLine(); System.out.println(str); br.close(); */ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("opp-IO\\a.txt"))); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 18:46:20

Qwen3.7-Max原生智能体:从问答模型到自动干活的Agent跃迁

1. 这不是一次普通升级:Qwen3.7-Max 的“干活能力”到底指什么?“三个月连更三版后,Qwen3.7-Max 好像更会干活了”——这句话在技术社区里传开时,我正调试一个跨平台任务编排脚本。第一反应不是点开公告,而是打开终端敲…

作者头像 李华
网站建设 2026/6/23 18:44:51

Cursor编辑器深度解析:项目级语义感知与AI原生编码工作流

1. 为什么我停掉 VS Code 改用 Cursor?这不是又一个“AI 套壳”,而是编辑器底层逻辑的重写你有没有过这种体验:在 VS Code 里敲下fetchUser,按下 Tab,它给你补全成fetchUser() { }——没错,语法对&#xff…

作者头像 李华
网站建设 2026/6/23 18:42:12

FEC以太网控制器:缓冲区描述符机制与嵌入式网络驱动开发实战

1. FEC以太网控制器:嵌入式网络通信的基石 在嵌入式系统开发中,网络功能早已从“锦上添花”变成了“不可或缺”。无论是工业物联网的传感器数据回传,还是消费电子设备的远程控制,其背后都离不开一个稳定、高效的以太网控制器。今天…

作者头像 李华
网站建设 2026/6/23 18:39:24

Ubuntu 18.04 安装 Anaconda 兼容性问题与修复方案

1. 为什么 Ubuntu 18.04 用户还在为 Anaconda 安装卡壳?——一个被低估的系统兼容性真相你点开这篇标题,大概率正卡在某个环节:wget 下载下来的 Anaconda 脚本双击没反应、bash 运行后卡在“Preparing transaction…”十分钟不动、source ~/.…

作者头像 李华
网站建设 2026/6/23 18:37:26

Postman自动化CSRF Token认证:环境变量与脚本实战指南

1. 项目概述:告别低效,让认证流程自动运转每次调试一个需要CSRF Token认证的后端接口,你是不是都得先手动在浏览器里登录,然后从开发者工具或者响应体里把那个长长的、看起来像乱码的Token字符串小心翼翼地复制出来,再…

作者头像 李华
网站建设 2026/6/23 18:35:47

Go context.Context 原理与工程实践:控制流统一管理指南

1. 为什么 Go 程序员总在函数签名里塞一个 context.Context?——不是为了“传参”,而是为了“交权” 你有没有写过这样的代码:一个 HTTP handler 启动了三个 goroutine 分别查数据库、调第三方 API、生成 PDF,然后用 sync.WaitGr…

作者头像 李华