【Java-----IO流(二)之字符流详解】

news/2024/4/27 7:46:53/文章来源:https://blog.csdn.net/qq_45071131/article/details/127603425

字符流概述

当使用字节流读取文件时,可能会有一个问题,就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储,所以Java提供了字符流类,以字符为单位读写数据,专门用于处理文本文件。

字符流=字节流+编码表

汉字在存储的时候,不管是GBK还是UTF-8,第一个字节都是负数

字符串中的编码和解码

编码就是把字符串转换成字节数组

  • byte[] getBytes():使用平台的默认字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中
  • byte[] getBytes(String charsetName):使用指定的字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中

解码就是把字节数组转换成字符串

  • String(byte[] bytes):通过使用平台的默认字符集解码指定的byte数组,构造一个新的String
  • String(byte[] bytes,String charsetName):通过使用指定的charset解码指定的byte数组,构造一个新的String

注意:使用什么字符集编码,就使用什么字符集解码

字符流抽象基类

  • Reader:这个抽象类是表示用于读取字符流的所有类的超类
  • OutputStream:这个抽象类是表示用于写出字符流的所有类的超类

字符输入流Reader

Java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中,它定义了字符输入流的基本共性功能方法:

  • public void close():关闭此流并释放与此流相关联的任何系统资源
  • public int read():从输入流读取一个字符
  • public int read(char[] cbuf):从输入流读取一些字符,并将它们存储到字符数组cbuf中

FileReader类

Reader有很多子类,以最简单常用的FileReader为例:FileReader类是读取字符文件的便利类,构造时使用系统默认的字符编码和默认字节缓冲区

构造方法

FileReader(File file):创建一个FileReader对象,给定要读取的File对象

File file=new File("D:\\aaa\\helloworld.txt");
FileReader fr=new FileReader(file);

FileReader(String fileName):创建一个FileReader对象,给定要读取的文件的名称

FileReader fr=new FileReader("D:\\aaa\\helloworld.txt");

当你创建一个流对象时,必须传入一个文件路径,与字节流类似

读取字符数据

read():读取字符,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1

File file=new File("D:\\aaa\\helloworld.txt");//文件中的内容是:我是中国人
FileReader fr=new FileReader(file);
int b;
while((b=fr.read())!=-1) {System.out.print((char)b);
}
fr.close();
//输出:我是中国人

read(char[] cbuf):使用字符数组读取,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回-1

File file=new File("D:\\aaa\\helloworld.txt");
FileReader fr=new FileReader(file);
int len;
char[] c=new char[2];
while((len=fr.read(c))!=-1) {System.out.println(new String(c));
}
fr.close();
/*输出:我是中国人国
*/

最后一次输出了“人国”是由于最后一次读取时,只读取一个字符“人”,数组中上次读取的数据没有被完全替换,所以要通过len获取有效的字符,改进代码如下:

File file=new File("D:\\aaa\\helloworld.txt");
FileReader fr=new FileReader(file);
int len;
char[] c=new char[2];
while((len=fr.read(c))!=-1) {System.out.println(new String(c,0,len));
}
fr.close();
/*输出:我是中国人
*/

字符输出流Writer

Java.io.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地,它定义了字符输出流的基本共性功能方法:

  • void write(int c):写入单个字符
  • void write(char[] cbuf):写入字符数组
  • abstract void write(char[] cbuf,int off,int len):写入字符数组的某一部分,off是数组的开始索引,len是要写入的字符个数
  • void write(String str):写入字符串
  • void write(String str,int off,int len):写入字符串的某一部分,off是字符串的开始索引,len是要写入的字符个数
  • void flush():刷新该流的缓冲
  • void close():关闭此流,但要先刷新它

FileWriter类

Writer有很多子类,以最简单常用的FileWriter为例:FileWriter类是写出字符到文件的便利类,构造时使用系统默认的字符编码和默认字节缓冲区

构造方法

FileWriter(File file):创建一个FileWriter对象,给定要写入的file对象

File file=new File("D:\\aaa\\helloworld.txt");
FileWriter fw=new FileWriter(file);

 FileWriter(String fileName):创建一个FileWriter对象,给定要写入的文件的名称

FileWriter fw=new FileWriter("D:\\aaa\\helloworld.txt");

当你创建一个流对象时,必须传入一个文件路径,与字节流类似

写入字符数据

write(int b):写出字符,每次可以写出一个字符数据

File file=new File("D:\\aaa\\helloworld.txt");
FileWriter fw=new FileWriter(file);
fw.write(19999);//中文编码表中19999对应一个汉字
fw.write(65);
fw.write('B');
fw.write('C');
fw.write('D');
fw.close();
//文件中写入:丢ABCD

注意:如果未调用close方法关闭资源,数据只是保存到缓冲区,并未保存到文件

write(char[] cbuf)和write(char[] cbuf,int off,int len):写出字符数组,每次可以写出字符数组中的数据

File file=new File("D:\\aaa\\helloworld.txt");
FileWriter fw=new FileWriter(file);
char[] c="我是中国人".toCharArray();
fw.write(c);//文件中写入:我是中国人
fw.write(c,2,3);//文件中写入:中国人
fw.close();

write(String str)和write(String str,int off,int len):写出字符串,每次可以写出字符串中的数据,更为方便

File file=new File("D:\\aaa\\helloworld.txt");
FileWriter fw=new FileWriter(file);
String s="我是中国人";
fw.write(s);//文件中写入:我是中国人
fw.write(s, 2, 3);//文件中写入:中国人
fw.close();

续写和换行:操作类似于FileOutStream

File file=new File("D:\\aaa\\helloworld.txt");
FileWriter fw1=new FileWriter(file);
String s="你好";
fw1.write(s);
fw1.close();
FileWriter fw2=new FileWriter(file,true);//续写
fw2.write("我是中国人");
fw2.write("\r\n");//写入换行
fw2.write("加油");
fw2.close();
/*文件中写入了:你好我是中国人加油
*/

关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,就无法写出字符到文件中,但是关闭的流对象,是无法继续写出数据的,如果我们既想写出数据到文件中,又想继续使用流,就需要使用flush方法

  • flush:刷新缓冲区,写入的字符会保存到文件中,流对象可以继续使用
  • close:先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用
File file=new File("D:\\aaa\\helloworld.txt");
FileWriter fw1=new FileWriter(file);
String s="你好";
fw1.write(s);
fw1.flush();//刷新后,文件中写入“你好”
fw1.write("谢谢");
fw1.close();//调用close方法,文件中写入“谢谢”

注意:即便是flush方法写出了数据,操作的最后还是要调用close方法,释放系统资源

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

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

相关文章

LeetCode刷题day25||216.组合总和III17.电话号码的字母组合--回溯

文章目录216.组合总和III题目描述思路分析代码17.电话号码的字母组合题目描述思路分析代码216.组合总和III 题目描述 题目链接 思路分析 相对于77. 组合 (opens new window),无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集…

基于全志T133-s3(Tina Linux)移植7寸RGB显示屏驱动

基于全志T133-s3(Tina Linux)移植7寸RGB显示屏驱动1.硬件电路2.LCD实物图3.LCD 的驱动4.uboot配置4.1.配置文件4.2.uboot设备树5.kernel配置5.1.内核配置5.2.设备树配置6.测试屏幕7.LVGL实测1.硬件电路 2.LCD实物图 3.LCD 的驱动 Tina Linux 提供了一套…

查题公众号搭建

查题公众号搭建 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击跳转…

TI Application Notes_Programming Chirp Parameters in TI Radar Devices

Application Notes_Programming Chirp Parameters in TI Radar Devices 1 介绍 system requirement and chirp configuration:系统要求决定了波形或者chirp如何配置。甲方首先提出要求,然后乙方根据要求进行chirp设计。chirp参数的不同会影响系统的参数,如Rmax,Vmax,Rre…

107.(前端)分类管理增加值实现——使用elementui中的动态编辑标签发送请求

1.概述 本节要实现的功能就是,当我们点击动态编辑标签时,丢失焦点或者回车时,发送请求。 2.流程 handleInputConfirm()中,验证form输入框中是否存在值,若存在添加数据到val,若不存在,就制空va…

RHCE(逻辑卷LVM,NFS服务)

LVM逻辑卷管理, 是将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很…

《循序渐进学docker》书摘

循序渐进学docker笔记摘要 docker工作流程docker版本控制 和增量更新docker制作和下发镜像流程图windows安装 :docker官网下载docker ToolDbxdocker搭建个人博客wordpressdocker搭建本地gitlab服务docker基本概念:镜像 容器 仓库docker指令和基本用法docker工作流程

MySQL调优之关联查询优化

我们准备如下两个表,并插入数据。 #分类 CREATE TABLE IF NOT EXISTS type ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRIMARY KEY (id) ); #图书 CREATE TABLE IF NOT EXISTS book ( bookid INT(10) UNSIGNED NOT NULL AU…

天翼物联亮相2022中国信息通信业发展高层论坛

近日,由中国通信企业协会主办的2022中国信息通信业发展高层论坛成功召开,天翼物联受邀出席论坛并分享了中国电信5G赋能未来的创新实践,共话“万物智联”发展未来。 本次论坛以“数智赋能 共创未来”为主题。在论坛专题报告环节,天…

同元软控新一代复杂装备虚拟试验解决方案与实践

在各类复杂装备工程研制中,试验的重要性是毋庸置疑的。试验作为整个研制流程中必不可少的环节,往往是物料、时间、经济等成本消耗最大的阶段。以航空发动机为例,据统计,现代航空发动机整体研制成本中,试验及试验所需的…

《2022中国企业数字化办公创新与实践产业研究报告》附下载丨三叠云

数字化时代已来,数字化办公工具 已成为企业数字化转型发展的基座 从思维理念到工具创新,办公从原来的物理空间走向现代化无边界的“云端” 数字化办公突破传统信息存储、挖掘、交互的藩篱,最终实现“办公协同” 需求与挑战并存&#xff0c…

数据结构——克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。与普里姆算法不同,它的时间复杂度为O(eloge)(e为边数),适合于求边稀疏的网的最小生成树 。克鲁斯卡尔算法从另一途径求网的最小生成树。其基本思想是&a…

疫情下的思考:全球疫情带来的危机与机遇

目录 敬重天道,敬重万物,这也许是化解危机的根源。 共同体的优势在于分工协作降低成本;劣势在于复杂性加深,脆弱不堪。 何为共同体? 危机四伏:社会整体运行的复杂性、机动性和动物性危机。 复杂性:疫情其实是在对…

力扣算法入门刷题

1、回文数 判断输入的整数是否是回文 我的一般思路: 将输入的整数转成字符串,再将这个字符串转成字符数组c,对字符数组进行遍历,如果第i个元素与第 c.length - i - 1 元素不相等,也就是通过比较首尾元素是否相同来判断…

D. Permutation Addicts(构造)

纯思维的1900构造还是有些顶,而且全球场和div12感觉还是没有难度分数通胀的,同等的分数全球场的题质量明显高一些。 D. Permutation Addicts 题意: 我们给定一个长度为n的排列a,我们通过a按照如下方法去构造一个数组b。 确定某…

目标检测算法——YOLOv5/YOLOv7改进之结合GAMAttention

关注”PandaCVer“公众号 深度学习Tricks,第一时间送达 目录 超越CBAM,全新注意力GAM:不计成本提高精度! (一)前沿介绍 1.GAM结构图 2.相关实验结果 (二)YOLOv5/YOLOv7改进之结…

景联文科技:车企如何解决自动驾驶数据标注难题?

“AI数据是人工智能行业的燃料,对自动驾驶领域头部企业来说,为了保持自身的竞争优势并加快自动驾驶应用安全落地进程,需要依靠大量的高质量标注数据做支撑,才能有效解决自动驾驶深度学习理论上遇到的问题。数据作为AI技术的底层基…

中国天然气除湿装置行业市场调研报告

目前,世界上除湿机的主要产地集中在意大利、日本、中国和中国台湾省等。中国在全球除湿机市场上的地位越来越突出,全球80%以上的除湿机产自中国。我国除湿机行业内销和出口严重分化,表现为内销不足,出口过多。作为制冷行业的一个小…

自然语言生成技术现状调查:核心任务、应用和评估(1)

论文:《Survey of the State of the Art in Natural Language Generation: Core tasks, applications and evaluation》 Journal of Artificial Intelligence Research 61 (2018) 65-170 Submitted 02/17; published 01/18 2018年的论文(live-5477-103…

【计算机网络】linux网络相关常用命令

性能指标有哪些? 带宽:链路的最大传输速率(b/s)吞吐率:单位时间内成功传输的数据量时延:表示请求数据包发送后,收到对端响应,所需要的时间延迟。PPS,每秒网络包发送数量…