【Java基础】IO流(三):字符流的FileReader(文件字符输入流)和 FileWriter(文件字节输出流)

目录

字符流

1、FileReader(字符输入流)

1.1、无参的read( )方法示例

​编辑

1.2、有参的read(char[ ] buffer)方法示例

2、FileWriter(字符输出流)

字符流

字符流的底层其实就是字节流,即字符流 = 字节流 + 字符集

字符流特点:

        输入流:一次读一个字节,遇到中文时,一次读多个字节

        输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

使用场景:用于对于纯文本文件进行读写操作

因为 Reader 类和 Writer 类都是抽象类不能直接创建它们的对象,得看它们的子类:FileReader(文件字符输入流)和 FileWriter(文件字节输出流)

1、FileReader(字符输入流)

FileReader的书写步骤:

1.创建字符输入流对象

构造方法方法说明

public FileReader(File file)

创建字符输入流关联本地文件

public FileReader(String pathname)

创建字符输入流关联本地文件

 提示:如果文件不存在,就直接报错。

2.读取数据

构造方法方法说明

public int read()

读取数据,若读到末尾返回-1

public int read(char[ ] buffer)

读取多个数据,返回所读取数据的个数,读到末尾返回-1

提示:

(1)按字节进行读取。遇到中文,一次读多个字节,读取后解码,返回一个整数

(2)读到文件末尾了,read方法返回-1。

3.释放资源        方法为:public int close()        释放资源/关流

1.1、无参的read( )方法示例

 用字符输入流的read( )方法读取在aaa.txt中的汉字

代码:

public static void main(String[] args) throws IOException {/*第一步:创建对象public FileReader(File file)        创建字符输入流关联本地文件public FileReader(string pathname)  创建字符输入流关联本地文件第二步:读取数据public int read()                   读取数据,读到末尾返回-1public int read(char[] buffer)      读取多个数据,读到末尾返回-1第三步:释放资源public void close()                 释放资源/关流*///1.创建对象并关联本地文件FileReader fr = new FileReader("..\\javaEEStudy\\aaa.txt");//2.读取数据 read()//字符流的底层也是字节流,默认也是一个字节一个字节的读取的。//如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读三个字节//idea默认是用UTF-8;eclipse默认是用GBKint ch;while ((ch = fr.read()) != -1) {System.out.print(ch);}//3.fr.close();
}

 运行结果:

        为什么这时候的结果全是数字?这是因为空参的read( )方法,默认是一个字节一个字节的读取的,如果遇到中文就会一次读取多个。在读取之后,方法的底层会进行解码并转成十进制,最终把这个十进制作为返回值,而这个十进制的数据也表示在字符集上的数字。比如:一个英文在文件里面的二进制数据是 0110 0001,read方法进行读取,然后会把这个二进制数据进行解码并转成十进制,就是97;一个中文在文件里面的二进制数据是 11100110 10110001 10001001,read方法进行读取,然后会把这三个字节的二进制数据解码并转成十进制,就是27721。然后就会把这些十进制数赋值给变量 ch,所以输出的结果就全是数字了

如果想看到中文汉字,就是把这些十进制数据,进行强转就可以了

即:把代码中的 System.out.print(ch); 改成 System.out.print((char)ch);

 改动后运行结果:

1.2、有参的read(char[ ] buffer)方法示例

 用字符输入流的read(char[ ] buffer)方法读取在aaa.txt中的汉字

 代码:

public static void main(String[] args) throws IOException {/*第一步:创建对象public FileReader(File file)        创建字符输入流关联本地文件public FileReader(string pathname)  创建字符输入流关联本地文件第二步:读取数据public int read()                   读取数据,读到末尾返回-1public int read(char[] buffer)      读取多个数据,读到末尾返回-1第三步:释放资源public void close()                 释放资源/关流*///1.创建对象并关联本地文件FileReader fr = new FileReader("..\\javaEEStudy\\aaa.txt");//2.读取数据char[] chars = new char[2];int len;while ((len = fr.read(chars)) != -1) {//把数组中的数据变成字符串再进行打印	System.out.println(new String(chars,0,len));//这里的String(//chars:要转成字符串的字符数组,//0:表示从字符数组的0索引开始,//len:表示字符数组中要转成字符串的字符个数)}//3.释放资源fr.close();
}

 运行结果:

为什么是两两一行的打印?这是因为打印时用的是System.out.println(); ,并且一次读取几个数据是根据字符数组的大小来决定的,此时字符数组定的大小是2,每读取到两个汉字就被 println() 打印出来并且换行了,所以就是两两一行的打印

为什么有些一行只有一个字并且还有空行?这是因为在文件中的每一行最后一个字后都有隐藏的换行符“\r\n”(如下图所示),比如读取第一行最后一个字“片”时,还有它后面的“\r”也被读取了,这时候就换行了,而“\r”后面的“\n”就和第二行的第一个字“想”一起被读取,“\n”也是换行,所以就换行后再打印的“想”

 

System.out.println(new String(chars,0,len)); 改成 System.out.print(new String(chars,0,len)); 

改动后运行结果:

        read(char[ ] buffer)方法把读取数据,解码,强转三步合并了,把强转之后的字符放到数组当中。

        有参的read方法 = 空参的read方法 + 强转类型转换

2、FileWriter(字符输出流)

FileWriter构造方法

构造方法方法说明

public FileWriter(File file)

创建字符输出流关联本地文件

public FileWriter(String pathname)

创建字符输出流关联本地文件

public FileWriter(File file,boolean append)

创建字符输出流关联本地文件,续写

public FileWriter(String pathname,boolean append)

创建字符输出流关联本地文件,续写

FileWriter成员方法

成员方法

方法说明

void write(int c)

写出一个字符

void write(String str)

写出一个字符串

void write(String str,int off,int len)

写出一个字符串的一部分

void write(char[ ] cbuf)

写出一个字符数组

void write(char[ ] cbuf,int off,int len)

写出字符数组的一部分

FileWriter书写步骤

1.创建字符输出流对象

参数是字符串表示的路径或者File对象都是可以的

如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

2.写数据

如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

3.释放资源

每次使用完流之后都要释放资源

代码示例: 

用字符输出流的write(String str)方法往文件bbb.txt中写入汉字 

public class WriterTest {public static void main(String[] args) throws IOException {//1.创建对象并关联本地文件FileWriter fw = new FileWriter("..\\javaEEStudy\\bbb.txt",true);//创建要写入数据的字符串,并且换行String str = "\r\n这是一首简单的小情歌";//写入数据fw.write(str);//关闭资源fw.close();}
}

运行结果: 

 FileWriter其他方法的写法都差不多,这里就不一一演示了

推荐: 

【java基础】IO流(一):字节流的FileOutputStream(文件字节输出流)和 Filelnputstream(文件字节输入流)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136631816?spm=1001.2014.3001.5501【java基础】异常处理机制-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136581375?spm=1001.2014.3001.5501【数据结构】二叉查找树和平衡二叉树,以及二者的区别_二叉查找树和其他二叉树的区别-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136137098?spm=1001.2014.3001.5501

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

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

相关文章

【数据挖掘】练习2:数据管理2

课后作业2&#xff1a;数据管理2 一&#xff1a;上机实验2 # 编写函数stat&#xff0c;要求该函数同时计算均值&#xff0c;最大值&#xff0c;最小值&#xff0c;标准差&#xff0c;峰度和偏度。 install.packages("timeDate") library(timeDate) stat <- func…

Unity引擎是否被过度吹嘘?

提到Unity&#xff0c;人们基本上持有以下几种观点&#xff1a; A. 很多人十分欣赏Unity在跨平台兼容性和大规模开放世界场景方面的出色表现。其渲染、环境特效以及AI系统为设计多样化沙盒游戏提供了强大支持。这使得Unity非常适合开发具有多种游戏玩法和互动系统的作品。 B. 一…

el-form 的表单校验,如何验证某一项或者多项;validateField 的使用

通常对form表单的校验都是整体校验&#xff1a; this.$refs.form.validate( valid > {if (valid) {// 校验通过&#xff0c;业务逻辑代码...} }); 如果需要对表单里的特定一项或几项进行校验&#xff0c;应该如何实现&#xff1f; 业务场景&#xff1a;下图点探测按钮时…

Machine Learning ---- Feature Scaling

目录 一、What is feature scaling:&#xff1a; 二、Why do we need to perform feature scaling? 三、How to perform feature scaling: 1、Normalization: 2、Mean normalization: 3、Standardization (data needs to follow a normal distribution): 一、What is featur…

Java——网络编程

网络编程基础类 InetAddress类 java.net.InetAddress类用来封装计算机的IP地址和DNS(没有端口信息),它包括一个主机名和一个ip地址,是java对IP地址的高层表示。大多数其他网络类都要用到这个类&#xff0c;包括Sorket、ServerSocker、URL、DatagramSorket、DatagramPacket等常…

LIGHTHOUSE Apex RBP应用案例|汽车涂装行业 电动汽车电池制造行业的颗粒物监测首选

Lighthouse ApexBP汽车制造中的颗粒物监测技术无疑是汽车制造领域的一项革命性发展。它不仅提供了全面、高精度的颗粒检测&#xff0c;而且能够轻松集成到现有的制造流程中&#xff0c;满足自动化需求&#xff0c;加强质量控制&#xff0c;确保电动汽车电池生产的安全性和效率。…

在Latex中优雅的插入svg图片(Ubuntu22.04)

文章目录 一、前言二、准备工作三、脚本编程四、结论 一、前言 在 LaTeX \LaTeX LATE​X 中&#xff0c;插入图片常用的为 figure 环境加 \includegraphics 命令&#xff1a; \begin{figure}[!htbp]\centering\includegraphics[width\textwidth]{图片名.jpg/jpeg/png/pdf}\c…

【LeetCode热题100】104. 二叉树的最大深度(二叉树)

一.题目要求 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&am…

【文本挖掘与文本分析】上机实验二

实验目的和要求 了解ROSTContentMining5.8可视化标签云的基本操作&#xff1b;采集某部小说进行分词与词频分析基于某背景图制作词云 或采集二十大报告进行分词与词频分析&#xff1b;基于某背景图制作二十大报告的词云&#xff1b; 数据来源 《射雕英雄传》或《鬼吹灯之精绝…

Java后端面试:框架篇高频面试(Spring、SpringMVC、SpringBoot、MyBatis)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Java后端面试&#xff1a;MySQL面试篇&#xff08;底层事务、SQL调优&#xff09; &#x1f4da;订阅专栏&#xff1a;Java后端面…

数字化转型导师坚鹏:人工智能在金融机构数字化转型中的应用

人工智能在金融机构数字化转型中的应用 课程背景&#xff1a; 金融机构数字化转型离不开人工智能&#xff0c;在金融机构数字化转型中&#xff0c;人工智能起到至关重要的作用&#xff0c;很多机构存在以下问题&#xff1a; 不清楚人工智能产业对我们有什么影响&#xff1f;…

C++_day4:成员函数版本和全局函数版本实现算术运算符的重载

1、成员函数版本和全局函数版本实现算术运算符的重载 程序代码&#xff1a; #include <iostream>using namespace std;//封装一个 名叫Number 的类 class Number {//全局函数做友元&#xff0c;让一些函数访问一个类的私有数据成员friend const Number operator-(const…