字符流的讲解 以及 Reader和Writer的用法

文章目录

    • ❤专栏导读
    • ❤字符流
    • ❤Reader类的操作
  • ❤Writer类操作
    • ❤Writer类的构造方法

❤专栏导读

🚀《多线程》
🚀《数据结构剖析》
🚀《JavaSE语法》

在Java标准库中,提供的读写文件的流对象有很多很多的类,但是可以将这么多的类总结成两个大的方向就是:字节流、字符流,而字节流就是针对于二进制文件进行读写操作,字符流就是针对文本文件进行读写操作

❤字符流

使用字符流,读写操作是以字符为单位的,每次最少读/写一个字符,而一个字符是多少个字节,就取决于当前的字符集是哪一种;

GBK字符集:一个中文字符是两个字节,一个英文字符是一个字节

UTF8字符集:一个中文字符是三个字节,一个英文字符是一个字节

其实,字符流是针对字节流又进行了一次封装,因为,在硬盘中,所有的文件都是以字节为单位进行保存的,都是二进制数据,但是,使用字符流的话,会将几个连续的字节给翻译成对应的字符,也就相当于自动帮我们完成了一个查字符集表的操作;

针对于字符流的操作,Java实现Reader(输入) 和 Writer(输出) 两个父类

什么叫输入(读),什么叫输出(写)?

假如,我向硬盘中保存一份内容,那么这是输入还是输出呢?

如果是站在硬盘的角度,向硬盘中保存一份内容,那么这就是输入(读),从硬盘中拿走一份数据, 那么这就是输出(写)

如果是站在操作系统的角度,向硬盘中保存一份内容,那么就是输出(写), 从硬盘中拿走一份数据,这就是输入(读)

但是,我们程序员一定要站在操作系统的角度去看,不要站在硬盘的角度看

❤Reader类的操作

  public static void main(String[] args) throws FileNotFoundException {Reader reader = new FileReader("d:/新建文件夹/text.txt");//因为Reader类是一个抽象类,所以只能new它的子类}
返回值类型方法说明
intread()无参数,一次读取一个字符
intread(char[] cbuf)一次读取若干字符,尽量把字符数组填满
intread(char[] cbuf,int off, int len)一次读取若干个字符,尽量将数组中,从off这个位置开始放数据,最多放len个

💡==注意点一:==为什么这个无参数的read()方法是一个int类型?

因为,这里是用了0-65536范围的数表示一个char类型的字符,因为0-65535是一个无符号的char,所以使用int类型足够表示,但是这里为什么要用int表示呢?因为是为了区分当前读操作是否读到了文件内容的末尾,如果读到了内容末尾,就返回一个-1表示已经读完了,这一点在方法说明中也可以看到;

在这里插入图片描述

💡==注意点二:==因为read()读取的是两个字节,如果是Unicode字符集编码,那么不会出现问题,但如果是UTF8字符集编码的话,一个中文字符是3个字节,这样的话不就会出现bug么,针对于这个问题,Java内部也是解决的非常好的,因为,在Java中,如果只使用char的话,那么字符集使用的就是Unicode,但是如果使用String,大概率使用的就是UTF8, 因为,是否是UTF8编码这个事情呢,是可配置的,但是char的话,固定就是Unicode,而举个例子。

假如有char[] 数组,这个数组固定使用的就是Unicode编码,如果使用这个数组构建字符串时,Java内部就会将Unicode编码转变为UTF8编码,如果有一个字符串s,使用s.charAt(0),拿到一个字符时,就会将UTF8编码转变成Unicode

接下来就演示一下读操作,将记事本中的所有内容读出来;

1.无参数read()

    public static void main(String[] args) throws IOException {Reader reader = new FileReader("d:/新建文件夹/text.txt");while(true) {int n = reader.read();if(n == -1) {//表示已经读完,退出循环break;}char ch = (char) n;System.out.print(ch);}}

2.带有指定数组的read()

    public static void main(String[] args) throws IOException {Reader reader = new FileReader("d:/新建文件夹/text.txt");while(true) {char[] cbuf = new char[1024];//这里定义了一个大小为1024的数组,读取时会尽量给这个数组填满,int n = reader.read(cbuf);if(n == -1) {System.out.println(n);break;}System.out.println(n);for(int i = 0; i < n; i++) {System.out.print(cbuf[i] + " ");}System.out.println();}}

3.带有三个参数的read()

public static void main(String[] args) throws IOException {Reader reader = new FileReader("d:/新建文件夹/text.txt");while(true) {char[] cbuf = new char[10];int n = reader.read(cbuf, 2, 8);//从2下标开始放数据,最多放8个数据if(n == -1) {System.out.println(n);break;}System.out.println(n);for(int i = 0; i < cbuf.length; i++) {System.out.print(cbuf[i]);}System.out.println();}}

在这里插入图片描述

💡==注意点三:==对于流操作,使用完之后,**一定要记得调用 close() 释放文件描述符表,**而这个文件描述符表是一个类似于数组这样的结构,因为一个进程每打开一个文件,就会在这个数组中占一个位置,但是,这个数组是有容量限制的,所以,如果一直打开文件,而不关闭文件,就会使这个表中的元素越来越多,一直到把这个数组占满,后续再打开文件时,就会出错,所以就构成了文件资源泄露 !!!

    public static void main(String[] args) throws IOException {Reader reader = new FileReader("d:/新建文件夹/text.txt");//第一种,使用try、finally释放文件资源的方式try{while(true) {char[] cbuf = new char[10];int n = reader.read(cbuf, 2, 8);if (n == -1) {System.out.println(n);break;}System.out.println(n);for (int i = 0; i < cbuf.length; i++) {System.out.print(cbuf[i]);}System.out.println();}}finally {//使用finally,防止代码中万一抛出异常,导致执行不到close();reader.close();}//第二种,使用try释放文件资源的方式//1.这个语法的目的就是,()定义的变量会在try里面的代码执行结束后,自动调用close()//2.只用实现Closeable接口的对象才能放再try()中try(Reader reader = new FileReader("d:/新建文件夹/text.txt")){while(true) {char[] cbuf = new char[10];int n = reader.read(cbuf, 2, 8);if (n == -1) {System.out.println(n);break;}System.out.println(n);for (int i = 0; i < cbuf.length; i++) {System.out.print(cbuf[i]);}System.out.println();}}}

❤Writer类操作

    public static void main(String[] args) throws IOException {Writer writer = new FileWriter("d:/新建文件夹/text.txt");}

❤Writer类的构造方法

构造方法说明
write(int c)一次写入一个字符
write(char[] cbuf)一次写入一个字符数组中的内容
write(String str)一次写入一个字符串
write(String str, int off, int len)写入一个字符串,从字符串中的off位置开始写,写len个长度的字符
write(char[] cbuf, int off, int len)写入一个字符数组,从数组中的off位置开始写,写len个长度的字符

Writer中这些构造方法和Reader中构造方法的使用都是类似的,这里就不一一的演示了,只为大家举一个常用的

    public static void main(String[] args) throws IOException {try(Writer writer = new FileWriter("d:/新建文件夹/text.txt")) {writer.write("你真的好帅");}}

在这里插入图片描述

💡==注意点:==这里使用write向文件中写入内容时,会将原来文件中的内容覆盖掉,如果不想覆盖,在new FileWriter时传入一个true

Writer writer = new FileWriter("d:/新建文件夹/text.txt", true)

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

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

相关文章

计算机网络之物理层

物理层 1. 物理层的基本概念 2.物理层下面的传输媒体 传输媒体可分为两类&#xff0c;一类是导引型传输媒体&#xff0c;另一类是非导引型传输媒体。 3.传输方式 3.1 串行传输和并行传输 串行传输&#xff1a;串行传输是指数据是一个比特依次发送的&#xff0c;因此在发送端…

家居行业中跨区域EDI应用的优化策略

提到家居行业的国际知名企业&#xff0c;你会想到哪些&#xff1f;宜家IKEA还是家得宝The Home Depot&#xff1f;这些稳居家居行业第一梯队的企业都有哪些共同之处&#xff1f; 无论是北美市场还是欧洲市场&#xff0c;这些企业都有一个共同点&#xff1a;他们采用EDI&#x…

【Redis系列】Redis上设置key,value的时候出现NOAUTH Authentication required提示如何解决?

哈喽&#xff0c;大家好&#xff0c;我是小浪。相信大家在初学一门新的知识点的时候都会遇到各种各样的问题&#xff0c;在网上找了一大堆的解决方案&#xff0c;最后还是无功而返&#xff0c;那么今天博主就记录一下在进行Redis的一些操作中遇到的问题~ 当我们好不容易安装好R…

国际阿里云:提高CDN缓存命中率教程!!!

CDN缓存命中率低会导致源站压力大&#xff0c;静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因&#xff0c;选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时&#xff0c;如果CDN节…

给在读博士的建议

早上起床第一件事&#xff0c;瞄了眼知乎&#xff01; 发现现在的手机真的很智能&#xff0c;也许是聊天的时候不经意间提了一句&#xff0c;早上就推荐了自己想看到的东西&#xff01; 分享给大家&#xff01; 有哪些给在读博士的建议&#xff1f; 如何通过一句话判断一个博士…

LeetCode(12)时间插入、删除和获取随机元素【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 380. O(1) 时间插入、删除和获取随机元素 1.题目 实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回…

Karmada更高效地实现故障转移

随着云原生技术的发展&#xff0c;其应用场景不断扩大。越来越多的企业开始将应用程序部署在 Kubernetes 集群中&#xff0c;随着 Kubernetes 集群规模的不断扩大&#xff0c;也带来了许多管理挑战&#xff0c;例如多集群间负载均衡、资源调度、故障转移等问题。为了解决这些问…

【QT系列教程】之二创建项目和helloworld案例

文章目录 一、QT创建项目1.1、创建项目1.2、选择创建项目属性1.3、选择路径和项目名称1.4、选择构建项目类型1.5、布局方式1.6、翻译文件&#xff0c;根据自己需求选择1.7、选择套件1.8、项目管理&#xff0c;自行配置1.9、配置完成&#xff0c;系统自动更新配置 二、QT界面介绍…

istio学习笔记-安装

Istioldie 1.18 / 安装指南 基于Kubernetes的Istio的微服务架构需要安装以下组件&#xff1a; Istio控制平面组件&#xff1a;包括Istio-Pilot、Istio-Policy、Istio-Telemetry等。这些组件负责微服务的管理和配置&#xff0c;如流量管理、策略执行、遥测数据收集等。数据平面…

2023-11-15 LeetCode每日一题(K 个元素的最大和)

2023-11-15每日一题 一、题目编号 2656. K 个元素的最大和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。将选中…

安装 Lua 的 HTTP 库

首先&#xff0c;你需要安装 Lua 的 HTTP 库。可以使用 LuaRocks 来安装。以下是安装命令&#xff1a; luarocks install http然后&#xff0c;你可以使用以下代码来爬取网页内容&#xff1a; local http require http-- 设置代理信息 http.set_proxy(jshk.com.cn)-- 网页UR…

【C#学习】button:只显示图片

第一步&#xff1a;设置按钮背景图片&#xff0c;并且图片随按钮大小变化 第二步&#xff1a;设置按钮使之只显示图片 button1.FlatStyle FlatStyle.Flat;//stylebutton1.ForeColor Color.Transparent;//前景button1.BackColor Color.Transparent;//去背景button1.FlatAppe…

Flutter笔记:使用Flutter构建响应式PC客户端/Web页面-案例

Flutter笔记 使用Flutter构建响应式PC客户端/Web页面-案例 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/detai…

Live800:客服行业的发展历程及未来前景

随着信息技术和互联网的高速发展&#xff0c;客服行业也在不断变革和发展。客服行业是一个服务型的行业&#xff0c;其发展历程也与人们对服务需求的变化密切相关。本文将介绍客服行业的发展历程和未来前景。 客服行业的发展历程 20世纪70年代&#xff0c;客服行业主要以电话服…

uniapp运行到安卓模拟器一直在“同步手机端程序文件完成“界面解决办法

如果你是用的模拟器是android studio创建的模拟器&#xff0c;那么你需要新创建一个android11 x86架构的模拟器&#xff1a; 创建完成后&#xff0c;启动模拟器&#xff1a; 然后在hbuilder中重新运行到这个模拟器就可以了&#xff1a; 运行结果&#xff1a; 如果你是用安…

算法:穷举,暴搜,深搜,回溯,剪枝

文章目录 算法基本思路例题全排列子集全排列II电话号码和字母组合括号生成组合目标和组合总和优美的排列N皇后有效的数独解数独单词搜索黄金矿工不同路径III 总结 算法基本思路 穷举–枚举 画出决策树设计代码 在设计代码的过程中&#xff0c;重点要关心到全局变量&#xff…

在windows上利用vmware17 搭建centos7 mini版本服务器

安装centos7mini 修改名称和安装路径 也可以点击自定义硬件&#xff0c;进行硬件配置修改 设置内存 设置处理器 点击下图按钮进行设置 点击done 点击开始安装 点击设置root密码 设置成功&#xff0c;点击done &#xff0c;root密码设置的简单的话需要按两次done 等待安装完成…

【算法与数据结构】46、47、LeetCode全排列I, II

文章目录 一、46.全排列I二、47.全排列II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、46.全排列I 思路分析&#xff1a;本题要求是全排列&#xff0c;意味着每次递归的时候startIndex都要从0开始&#xff0c;否则…

Java排序算法之归并排序

图解 归并排序是一种效率比较高的分治排序算法&#xff0c;主要分为两个步骤&#xff0c;分别为“分”和“并”。 分&#xff1a;将序列不断二分&#xff0c;直到每个子序列只有一个元素为止。 并&#xff1a;将相邻两个子序列进行合并&#xff0c;合并时比较两个子序列的元素…

数字人,虚拟数字人——你看好数字人领域的发展吗?

你看好数字人领域的发展吗&#xff1f; 目录 一、虚拟人、数字人、虚拟数字人基本概念 1.1、虚拟人&#xff08;Virtual Person&#xff09; 1.2、 数字人&#xff08;Digital Human&#xff09; 1.3、虚拟数字人&#xff08;Virtual Digital Human&#xff09; 1.4、侧重…