【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()                   读取数据,读到末尾返回-1
        public 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默认是用GBK
    int 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()                   读取数据,读到末尾返回-1
        public 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac激活pycharm,python环境安装和包安装问题

1.PyCharm到官网下载就行 地址:Other Versions - PyCharm (jetbrains.com) 2.MacOS 下载python环境,地址: Python Releases for macOS | Python.org 3.PyCharm环境配置: 4. 如果包下载不下来可以换个源试试 pip install py…

前后端分离:现代Web开发的协作模式

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【NTN 卫星通信】 TN和多NTN配合的应用场景

1 场景描述 此场景描述了农村环境,其中MNO (运营商TerrA)仅在城市附近提供本地地面覆盖,而MNO (SatA)提供广泛的NTN覆盖。SatA使用GSO轨道和NGSO轨道上的卫星。SatA与TerrA有漫游协议,允许:   所有TerrA用户的连接,当这些用户不…

Linux批量注释

1.注释行 1.按ctrlv进入块选择模式 ,然后上下键选中需要注释的行 2.按shifti(也就是大写I) 然后输入// 或 # 3.按ESC键 2.取消注释行 1.按ctrlv进入块选择模式, 然后上下键选中需要取消注释的行 2.然后按d

【工具】一键生成动态歌词字幕

那眼神如此熟悉 让人着迷无力抗拒 一次又一次相遇 在眼前却遥不可及 命运总爱淘气 将一切都藏匿 曾有你的回忆 无痕迹 若不是心心相吸 又怎么会一步一步靠近 🎵 董真《思如雪》 下载LRC歌词 https://www.musicenc.com/article/50287.htmlhttp…

Word粘贴时出现“运行时错误53,文件未找到:MathPage.WLL“的解决方案

在安装完MathType后,打开word复制粘贴时报错“运行时错误53,文件未找到:MathPage.WLL” 首先确定自己电脑的位数(这里默认32位) 右击MathType桌面图标,点击“打开文件所在位置”, 然后分别找到MathPage.W…

【算法训练营】最近点对,纸牌,青蛙(Python实现)

最近点对 描述 给定n个二维平面上的点,求距离最近的一对点,输出他们的距离。 输入 第一行包含一个正整数n。 接下来n行,每行包含两个整数x,y,表示一个点的坐标。 输出 输出距离最近的一对点的距离,保留两位小数。 样例…

[蓝桥杯练习题]Fizz Buzz经典问题

return的艺术 #include<bits/stdc.h> using namespace std; int main(){ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);int n;cin>>n;if(n%50&&n%30)return !(cout<<"FizzBuzz");if(n%30)return !(cout<<"Fizz&…

spc x-bar 正态分布 echarts demo

使用echarts,elementUi,vue编写的spc分析的demo示例. 含x-bar和正态分布图,同一数据可以互转 chart.vue <template><div class"app-container"><el-row><el-col :span"4" class"button-container"><el-button clic…

C++之类和对象(3)

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit 2. static成员 2.1 概念 3. 友元 3.1 友元函数 3.2 友元类 4. 内部类 5. 匿名对象 6. 拷贝对象时编译器做出的优化 1. 再谈构造函数 1.1 构造函数体赋值 class Date { public:Date(int year2024…

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

Day39:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化

目录 SpringBoot-监控系统-Actuator SpringBoot-接口系统-Swagger 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方组件使用等. 框架库&#xff1a;MyB…

十五、自回归(AutoRegressive)和自编码(AutoEncoding)语言模型

参考自回归语言模型&#xff08;AR&#xff09;和自编码语言模型&#xff08;AE&#xff09; 1 自回归语言模型&#xff08; AR&#xff09; 自回归语言模型&#xff08;AR&#xff09;就是根据上文内容&#xff08;或下文内容&#xff09;预测下一个&#xff08;或前一个&…

由浅到深认识C语言(13):共用体

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

Unity Live Capture 中实现面部捕捉同步模型动画

Unity Face Capture 是一个强大的工具&#xff0c;可以帮助你快速轻松地将真实人脸表情捕捉到数字模型中。在本文中&#xff0c;我们将介绍如何在 Unity Face Capture 中实现面部捕捉同步模型动画。 安装 |实时捕获 |4.0.0 (unity3d.com) 安装软件插件 安装 Live Capture 软件…

(一)Neo4j下载安装以及初次使用

&#xff08;一&#xff09;下载 官网地址&#xff1a;Neo4j Graph Database & AnamConnect data as its stored with Neo4j. Perform powerful, complex queries at scale and speed with our graph data platform.https://neo4j.com/ &#xff08;二&#xff09;安装并配…

JavaWeb--HTML

一&#xff1a;HTML简介 *HTML是一门语言&#xff0c;所有的网页都是用HTML这门语言编写出来的&#xff1b; *HTML&#xff1a;超文本标记语言&#xff1b; 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff0c;还能定义图片&#xff…

Java NIO浅析

NIO&#xff08;Non-blocking I/O&#xff0c;在Java领域&#xff0c;也称为New I/O&#xff09;&#xff0c;是一种同步非阻塞的I/O模型&#xff0c;也是I/O多路复用的基础&#xff0c;已经被越来越多地应用到大型应用服务器&#xff0c;成为解决高并发与大量连接、I/O处理问题…

linux上MySQL的安装

(1)解压安装包 tar -xzvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.33-linux-glibc2.12-x86_64 /usr/local/mysql(2)创建数据目录 [roothecs-161929 3306]# mkdir -p /data/mysql/3306/data [roothecs-161929 3306]# mkdir -p /data/mysql/3306/binlog [roo…

章鱼网络 Community Call #19|​开启与 Eigenlayer 的合作

香港时间2024年3月8日12点&#xff0c;章鱼网络举行第19期 Community Call。 在过去的一个月&#xff0c;章鱼网络在成功完成 $NEAR Restaking 功能的安全审计之后&#xff0c;一直在稳步吸引关注。事实上&#xff0c;在整个行业中&#xff0c;我们是极少数已经推出 Restaking …