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

-转换流-

它是字节流和字符流之间转换的桥梁

转换流本身其实是字符流;

转换流的位置:

Snipaste_2024-02-09_09-35-03.png
分为两个:
字符转换输入流:InputStreamReader
将InputStream转换为Reader
字符转换输出流:OutputStreamWriter
将Writer转换为OutputStream


作用:

  1. InputStreamReader可将字节流先转换为字符流
    1. 可以指定字符集读写
    2. 可使用字符流中的方法了
  2. OutputStreamWriter可将字符流转为字节流

Snipaste_2024-02-09_09-40-02.png


用两个练习了解转换流:

练习一:
image.png

需求1:手动创建一个gbk的文件,把文件中的中文读取到内存中,不能出现乱码

1.首先准备一段用GBK编码的文本
image.png
image.png
放在idea中会乱码,因为idea默认使用UTF-8编码规则
image.png

2.题目要求不能出现乱码,我们可以使用字符流

题解:方法一、二

/*需求1:手动创建一个gbk的文件,把文件中的中文读取到内存中,不能出现乱码*///需求1:
//方法一:使用转化流(已过时)----
//第一个参数要创建对应的字节流对象,第二个参数要,要指定和文本编码规则相同的解码规则---GBK
InputStreamReader isr = new InputStreamReader(new FileInputStream("..\\ioDemo\\gbkfile.txt"), "GBK");
//读取数据
int b;
while ((b = isr.read()) != -1) {System.out.print((char) b);
}
isr.close();System.out.println();
System.out.println("--------------");//方法二:底层就是调用转换流
//参数1:放要读取的文件,
//参数2:调用forName方法指定解码规则GBK
FileReader fr=new FileReader("..\\ioDemo\\gbkfile.txt", Charset.forName("GBK"));
int c;
while((c=fr.read())!=-1){System.out.print((char) c);
}
fr.close();

控制台:
终于为那一身江南烟雨覆了天下
容华谢后,不过一场
今日无事,戏院听曲,插花弄玉

终于为那一身江南烟雨覆了天下
容华谢后,不过一场
今日无事,戏院听曲,插花弄玉


需求2:把一段中文按照gbk的方式写到本地文件

//方法一:/*//创建转化流对象//第一个参数要创建对应的字节流对象,第二个参数指定要写出的格式OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("..\\ioDemo\\a.txt"),"GBK");//写出数据osw.write("你好世界");//关流osw.close();*///方法二:使用字符流,底层是使用转换流//创建字符流对象FileWriter fw=new FileWriter("..\\ioDemo\\a.txt", Charset.forName("GBK"));fw.write("你好世界");fw.close();

结果:
因为idea默认是UTF-8的解码方式,所以GBK格式的文本会出现乱码
image.png


需求3:将需求2的gbk文件,转成utf-8
思路:先用GBK解码规则读取GBK文件,然后用UTF-8编码方式写出文件


//方法一:
//创建转换流输入对象------读时候用GBK
/* InputStreamReader isr=new InputStreamReader(new FileInputStream("..\\ioDemo\\a.txt"),"GBK");
//创建转换流输出对象------输出时候用UTF-8
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("..\\ioDemo\\example.txt"),"UTF-8");//因为idea默认使用UTF-8所以可不写
//读写
int b;
while((b=isr.read())!=-1){
osw.write(b);
}
//关流
osw.close();
isr.close();*///方法二:
//使用字符流,底层是使用转换流
FileReader fr=new FileReader("..\\ioDemo\\a.txt",Charset.forName("GBK"));
FileWriter fw=new FileWriter("..\\ioDemo\\example.txt",Charset.forName("UTF-8"));因为idea默认使用UTF-8所以可不写
int b;
while((b=fr.read())!=-1){
fw.write(b);
}
fw.close();
fr.close();

a.txt:
image.png
example.txt:
image.png


练习二:
Snipaste_2024-02-09_09-41-46.png

问题:
1.字节流读取中文数据会有乱码—使用字符流解决
2.字节流没有读取一行数据的方法----使用字符字符缓冲流解决
思路:先将字节流 转为字符流 再转为字符缓冲流

//创建字节流对象FileInputStream fis=new FileInputStream("..\\ioDemo\\csb2.txt");//创建转换流对象----将字节流转成字符流       转化流其实就是字符流所以可放入BufferedReader参数InputStreamReader isr=new InputStreamReader(fis);//将字符流包装成字符缓冲流BufferedReader br=new BufferedReader(isr);//循环读取每一行String s ;while((s= br.readLine())!=null){System.out.println(s);}//关流br.close();

csb2.txt:
image.png
读取结果:
image.png

相关文章:

  • 08-Java过滤器模式 ( Filter Pattern )
  • QT设置qss
  • 11 插入排序和希尔排序
  • 《Docker极简教程》--Docker环境的搭建--在Mac上搭建Docker环境
  • C语言使⽤ scanf()函数应注意的问题是什么?
  • 设计模式(结构型模式)桥接模式
  • linux的tree用法
  • 【每日一题】LeetCode——反转链表
  • HCIA-HarmonyOS设备开发认证V2.0-3.轻量系统内核基础
  • vue绘制语音波形图---wavesurfer.js
  • FPS游戏框架漫谈第二十二天
  • 【go】ent操作之CRUD与联表查询
  • uniapp /微信小程序 使用map组件实现手绘地图方案
  • office文件转pdf在线预览
  • 【前端高频面试题--Vue基础篇】
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Django 博客开发教程 16 - 统计文章阅读量
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Java|序列化异常StreamCorruptedException的解决方法
  • java中具有继承关系的类及其对象初始化顺序
  • mysql中InnoDB引擎中页的概念
  • PHP 的 SAPI 是个什么东西
  • Python_OOP
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Vue UI框架库开发介绍
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 对象引论
  • 仿天猫超市收藏抛物线动画工具库
  • 和 || 运算
  • 警报:线上事故之CountDownLatch的威力
  • 聚类分析——Kmeans
  • 使用Swoole加速Laravel(正式环境中)
  • 推荐一个React的管理后台框架
  • postgresql行列转换函数
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​ubuntu下安装kvm虚拟机
  • #13 yum、编译安装与sed命令的使用
  • #14vue3生成表单并跳转到外部地址的方式
  • (1)(1.13) SiK无线电高级配置(六)
  • (2022 CVPR) Unbiased Teacher v2
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (阿里云万网)-域名注册购买实名流程
  • (八十八)VFL语言初步 - 实现布局
  • (二)PySpark3:SparkSQL编程
  • (九)One-Wire总线-DS18B20
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .gitignore文件—git忽略文件
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET Standard 的管理策略
  • .NET国产化改造探索(一)、VMware安装银河麒麟