Java IO中的 InputStreamReader 和 OutputStreamWriter


Java IO 的流,有三个分类的维度:

  • 输入流 or 输出流
  • 节点流 or 处理流
  • 字节流 or 字符流
    在这里插入图片描述

在Java IO库中,InputStreamReader和OutputStreamWriter是两个非常重要的类,它们作为字符流和字节流之间的桥梁。

这两个类使得开发者可以方便地以字符为单位读取或写入数据,即使底层数据源或目标是基于字节的。

这两个类的主要作用是将字节流(InputStream 和 OutputStream)转换为字符流(Reader 和 Writer),从而允许我们按照字符(而不是字节)的形式读取或写入数据,这在处理文本数据时特别有用。

一 InputStreamReader (处理流、字符流、输入流)

1. 定义与用途

  • InputStreamReader 是字节流通向字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。如果未指定字符集,它将使用平台的默认字符集。
  • 主要用途
    1. 读取文件或网络输入流中的文本数据。
    2. 转换任何类型的 InputStream 为 Reader,以便按字符读取数据。

2.构造方法示例

// 使用默认字符集  
InputStreamReader(InputStream in)  // 使用指定的字符集  
InputStreamReader(InputStream in, Charset cs)  // 使用指定的字符集名称  
InputStreamReader(InputStream in, String charsetName)

3.使用示例

/*** 将字节流 FileInputStream 包装成 字符流 InputStreamReader,* 对文件进行读取(按照 utf-8/gbk 格式)进而再包装成 BufferedReader*/
public class DecoratorStreamReaderDemo {//使用 InputStreamReader 转换流解决中文乱码问题//将字节流 FileInputStream 转换成字符流 InputStreamReader,指定编码 gbk/utf-8public static void main(String[] args) throws IOException {String filePath = "d:\\a.txt";//1.把 FileInputStream 转成 InputStreamReader//2.指定编码 gbkInputStreamReader isr = new InputStreamReader(new FileInputStream(filePath),"gbk");//3.把 InputStreamReader 代入 BufferedReaderBufferedReader br = new BufferedReader(isr);//4.读取String s = br.readLine();System.out.println("读取内容:"+ s);//5.关闭外层流br.close();}
}

通常,会将上述代码的 2、3 合在一起:

BufferedReader br2 = new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gbk")
);

二 OutputStreamWriter(处理流、字符流、输出流)

1.定义与用途

  • OutputStreamWriter 是字符流通向字节流的桥梁。它写入字符,并使用指定的字符集将其编码为字节。如果未指定字符集,它将使用平台的默认字符集。
  • 主要用途
    1. 将文本数据写入文件或网络输出流。
    2. 转换任何类型的 OutputStream 为 Writer,以便按字符写入数据。

2.构造方法示例

// 使用默认字符集  
OutputStreamWriter(OutputStream out)  // 使用指定的字符集  
OutputStreamWriter(OutputStream out, Charset cs)  // 使用指定的字符集名称  
OutputStreamWriter(OutputStream out, String charsetName)

3.使用示例

/*** 将字节流 FileOutputStream 包装成 字符流 OutputStreamWriter* 对文件进行写入(按照 gbk格式,可以指定其他)*/
public class DecoratorStreamWriterDemo {// OutputStreamWriter 使用public static void main(String[] args) throws IOException {String filePath = "d:\\b.txt";String  charset = "utf8";OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charset);osw.write("hi,小爱同学!");osw.close();System.out.println("使用"+charset +"编码方式,保存文件成功");}
}

注意事项

  • 当使用InputStreamReader和OutputStreamWriter时,重要的是要指定一个字符集,特别是当文件或数据流包含非ASCII字符时。这有助于确保字符的正确编码和解码。
  • 这两个类通常与BufferedReader和BufferedWriter一起使用,以提供缓冲功能,从而提高读取和写入操作的效率。
  • 在处理完文件或网络流后,应确保关闭所有打开的流,以释放系统资源。在上面的示例中,通过调用bufferedReader.close()或bufferedWriter.close()可以自动关闭底层的InputStreamReader/OutputStreamWriter和InputStream/OutputStream。这是因为BufferedReader和BufferedWriter的close方法被设计为关闭其下的所有流。

以上就是 Java IO中的 InputStreamReader 和 OutputStreamWriter 的全部内容,感谢阅读!

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

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

相关文章

整数或小数点后补0操作

效果展示: 整数情况: 小数情况: 小编这里是以微信小程序举例,代码通用可兼容vue等。 1.在utils文件下创建工具util.js文本 util.js页面: // 格式…

淘宝扭蛋机小程序:旋转惊喜,开启购物新篇章!

在追求创新与惊喜的购物时代,淘宝再次引领潮流,精心打造——淘宝扭蛋机小程序,为您的购物之旅增添一抹不同寻常的色彩。这不仅仅是一个购物工具,更是一个充满趣味、互动与惊喜的宝藏盒子,等待您来探索与发现。 【旋转…

通过Dockerfile构建镜像

案例一: 使用Dockerfile构建tomcat镜像 cd /opt mkdir tomcat cd tomcat/ 上传tomcat所需的依赖包 使用tar xf 解压三个压缩包vim Dockerfile FROM centos:7 LABEL function"tomcat image" author"tc" createtime"2024-07-16"ADD j…

【 香橙派 AIpro评测】烧系统运行部署LLMS大模型跑开源yolov5物体检测并体验Jupyter Lab AI 应用样例(新手入门)

文章目录 一、引言⭐1.1下载镜像烧系统⭐1.2开发板初始化系统配置远程登陆💖 远程ssh💖查看ubuntu桌面💖 远程向日葵 二、部署LLMS大模型&yolov5物体检测⭐2.1 快速启动LLMS大模型💖拉取代码💖下载mode数据&#x…

第九课:服务器发布(静态nat配置)

一个要用到静态NAT的场景,当内网有一台服务器server1,假如一个用户在外网,从外网访问内网怎么访问呢,无法访问,这是因为外网没办法直接访问内网,这时候需要给服务器做一个静态NAT。 静态NAT指的是给服务器…

gltf模型加载 与3d背景贴图

Poly Haveny 用于3d模型跟贴图下载资源 Sketchfab 里面有免费的模型 模型放到public里面 const loader new GLTFLoader()// 加载GLTF模型loader.load(/scene.gltf,(gltf) > {// 将加载的模型添加到场景中scene.add(gltf.scene)// 现在你可以开始渲染循环了let angle …

深度学习落地实战:基于UNet实现血管瘤超声图像分割

前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代…

类和对象(补充)

1.static成员 1>静态成员变量在类外进行初始化 2>静态成员变量为所有类对象所共享,不属于任何具体对象,存放在静态区中 3>静态成员函数没有this指针,可访问其他静态成员,但不可访问非静态的 4>非静态成员函数可以…

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免…

SQL Server 使用 OPTION (RECOMPILE) 和查询存储的查询

设置 我们正在使用 WideWorldImporters 数据库,您可以从 Github 下载【sql-server-samples/samples/databases/wide-world-importers at master microsoft/sql-server-samples GitHub】。我正在运行SQL Server 2017 的最新 CU【https://sqlserverbuilds.b…

[Vulnhub] digitalworld.local-JOY snmp+ProFTPD权限提升

信息收集 IP AddressOpening Ports192.168.101.150TCP:21,22,25,80,110,139,143,445,465,587,993,995 $ nmap -p- 192.168.101.150 --21,22,25,min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD | ftp-anon: Anonymous FTP logi…

基于Java中的SSM框架实现求职招聘网站系统项目【项目源码】

基于Java中的SSM框架实现线求职招聘网站系统演示 研究方法 本文的研究方法主要有: (1)调查法 调查法就是在系统的构思阶段,设计者对系统的功能和系统的现状有些不了解,需要去实地的去和本系统相关的区域进行调查&am…

数据结构——单链表详解(超详细)(2)

前言: 上一篇文章小编简单的介绍了单链表的概念和一些函数的实现,不过为了保证文章的简洁,小编把它分成了两篇来写,这一篇小编紧接上一篇文章继续写单链表函数功能的实现: 目录: 1.单链表剩余函数的编写 1.…

Idea如何快速高效的修改项目的包名

文章目录 前言一、全局替换的快捷键二、弹出如下的界面 前言 当我们有时候在做项目迁移的时候,需要快速的修改项目的包名!那么如何快速高效的修改项目的报名呢? 经过尝试了很多方法!最简单的方法就是利用全局替换来直接替换报名&…

微服务到底是个什么东东?

微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务运行在其独立的进程中,服务和服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的…

通过反射机制给已知属性赋值

最近在看spring,在手写spring框架之前,需要巩固一下反射。 反射有这样一个简单的例子,记录一下。 假如你知道age这个属性名,但是不知道属性类型,也可以写: 可以获取到属性的类型

设计模式-领域逻辑模式-事务脚本(Transaction Script)

事务脚本的特点 多数应用可看成由多个事务组成事务脚本将多个业务逻辑组织成单个过程事务间相互修改各自产生的数据 事务脚本的运行机制 使用事务脚本时,领域逻辑主要通过系统所执行的事务来组织。例如:预定酒店过程。 事务脚本的组织 将整个事务脚本放…

【BUG】已解决:IndexError: list index out of range

已解决:IndexError: list index out of range 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区…

对服务器进行基本了解(二)

目录 一. 云服务器数据库 1.查看MYSQL版本 2.查看mysql的运行状态 3.运行mysql 4. 进入mysql的用户 5. 更改用户密码 6. 查找mysql端口号 7. 创建一个数据库 8. 查看用户 9. 查看数据库 10. 显示数据库的表 11. 修改用户的host 12. 对用户赋权 13. 开放指定端…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述

3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别、跟踪及A2X(Aircraft-to-Everything)服务的支持。 3GPP TS 23.256 技术规范: 以下是文档的核心内容总结: UAV系…