【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.mzph.cn/news/750447.shtml

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

相关文章

基于ESTAR指数平滑转换自回归模型的CPI数据统计分析matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 ESTAR模型概述 4.2 WNL值,P值, Q值,12阶ARCH值 4.3ADF检验 5.完整程序 1.程序功能描述 基于ESTAR指数平滑转换自回归模型的CPI数据统计分析matlab仿…

LeetCode Python - 58. 最后一个单词的长度

目录 题目描述解法运行结果 题目描述 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s “Hel…

【Vue】Request模块 - axios 封装Vuex的持久化存储

📝个人主页:五敷有你 🔥系列专栏:Vue ⛺️稳中求进,晒太阳 Request模块 - axios 封装 使用axios来请求后端接口,一般会对axios进行一些配置(比如配置基础地址,请求响应拦截器…

HCIP—BGP邻居关系建立实验

BGP的邻居称为:IBGP对等体 EBGP对等体 1.EBGP对等体关系: 位于 不同自治系统 的BGP路由器之间的BGP对等体关系 EBGP对等体一般使用 直连建立 对等体关系,EBGP邻居之间的报文 TTL中值设置为1 两台路由器之间建立EBGP对等体关系&#xff0…

vue3新功能-Teleport

1.teleport 在组件内的任何位置渲染内容 将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 例:将组件dialog添加到body下面 <teleport to"body"> <el- dialog --> </teleport> 2.fragments 多个根元素外层不需要…

遵循Web标准规范,构建优质网页

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

Linux操作系统-汇编LED驱动程序基础

一、汇编LED原理分析 IMX6ULL-LED灯硬件原理分析&#xff1a; 1、使能时钟&#xff0c;CCGR0-CCGR6这7个寄存器控制着IMX6ULL所有外设时钟的使能。为了简单&#xff0c;设置CCGR0-CCGR6这7个寄存器全部为0XFFFFFFFF&#xff0c;相当于使能全部外设时钟。&#xff08;在IMX6ULL芯…

【Flink SQL】Flink SQL 基础概念(三):SQL 动态表 连续查询

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…

CSS学习(2)-盒子模型

1. CSS 长度单位 px &#xff1a;像素。em &#xff1a;相对元素 font-size 的倍数。rem &#xff1a;相对根字体大小&#xff0c;html标签就是根。% &#xff1a;相对父元素计算。 注意&#xff1a; CSS 中设置长度&#xff0c;必须加单位&#xff0c;否则样式无效&#xff…

Unity2019.2.x 导出apk 安装到安卓Android12+及以上的系统版本 安装出现-108 安装包似乎无效的解决办法

Unity2019.2.x 导出apk 安装到安卓Android12及以上的系统版本 安装出现-108 安装包似乎无效的解决办法 导出AndroidStudio工程后 需要设置 build.gradle文件 // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAINbuildscript {repositor…

MySQL的目录结构

安装目录 /usr/local/mysql数据目录 /usr/local/mysql/data配置目录 /usr/local/etc/my.cnf

2024海淘且免KYC虚拟信用卡

很多小伙伴都需要海淘&#xff0c;亚马逊、ebay、国际阿里巴巴、速卖通等等&#xff0c;我们这里都有卡支持&#xff0c;并且免kyc、免年费免月费 点击获取 按图片步骤注册开卡 海淘注意事项 海淘&#xff08;跨境购物&#xff09;可以让人们在国外购买到更多种类的商品&…

力扣每日一题 矩阵中移动的最大次数 DP

Problem: 2684. 矩阵中移动的最大次数 复杂度 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( n m ) O(nm) O(nm) Code class Solution { public int maxMoves(int[][] grid){int n grid.length;int m grid[0].length;int[][] f new int[n][m]…

Text-to-SQL 工具Vanna + MySQL本地部署 | 数据库对话机器人

今天我们来重点研究与实测一个开源的Text2SQL优化框架 – Vanna 1. Vanna 简介【Text-to-SQL 工具】 Vanna 是一个基于 MIT 许可的开源 Python RAG&#xff08;检索增强生成&#xff09;框架&#xff0c;用于 SQL 生成和相关功能。它允许用户在数据上训练一个 RAG “模型”&a…

浅谈HTTP 和 HTTPS (中间人问题)

前言 由于之前的文章已经介绍过了HTTP , 这篇文章介绍 HTTPS 相对于 HTTP 做出的改进 开门见山: HTTPS 是对 HTTP 的加强版 主要是对一些关键信息 进行了加密 一.两种加密方式 1.对称加密 公钥 明文 密文 密文 公钥 明文 2.非对称加密 举个例子就好比 小区邮箱 提供一…

调皮的String及多种玩法(上部)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 欢迎&#x1f64f;点赞&#x1f5e3;️评论&#x1f4e5;收藏&#x1f493;关注 &#x1f496;衷心的希…

数据库引论:2.SQL简介

SQL(Structured Query Language,结构化查询语言) 2.1 SQL查询语言概览 SQL语言包含 数据定义语言(Data-Definition Language,DDL)。SQL DDL提供定义关系模式、删除关系以及修改关系模式的命令。数据操纵语言(Data-Manipulation Language,DML)。SQL DML提供从数据库中查询信息…

企业微信 API 接口调用教程:深入解析企业微信 API 的用法

本文通过 access_token 凭证的方式来讲解怎么调用 企业微信 API&#xff0c;并一步步介绍如何获取企业微信 API 的 corpsecret、corpid、access_token 凭证以及怎么向企业微信的应用发送消息。 企业微信 API 在线地址为&#xff1a;qiyeweixin.apifox.cn/ &#xff0c;这个在线…

蓝桥杯单片机快速开发笔记——PWM

一、原理分析 使用定时器输出PWM&#xff08;脉宽调制&#xff09;信号是通过微控制器的定时器模块来生成一种周期性的脉冲信号&#xff0c;通过控制脉冲的高电平时间&#xff08;占空比&#xff09;来控制输出信号的平均功率。以下是生成PWM信号的基本原理概述&#xff1a; 定…

计算机网络——物理层(编码与调制)

计算机网络——编码与调制 基带信号和宽带信号编码与调制数字数据编码为数字信号非归零编码归零编码反向不归零编码曼彻斯特编码差分曼彻斯特编码4B/5B编码 数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号 我们之前讲了物理层的一些基础知识和两个准则&a…