首页 > 其他分享 >数据的读取和写入,其中Reader便是其中之一

数据的读取和写入,其中Reader便是其中之一

时间:2024-08-31 16:39:16浏览次数:4  
标签:字符 读取 写入 throws IOException Reader public

在Java开发过程中,我们经常需要读取文件中的数据,而数据的读取需要一个合适的类进行处理。Java的IO包提供了许多类用于数据的读取和写入,其中Reader便是其中之一。本文将对Java中的Reader进行详细介绍,并分析其优缺点及应用场景。

摘要
本文将从以下几个方面对Java中的Reader类进行详细介绍:

Reader类的概述
Reader类代码的解析
Reader类的应用场景案例
Reader类的优缺点分析
Reader类的方法介绍及源代码分析
Reader类的测试用例
全文小结和总结
附源码
建议
本文通过对Java中的Reader进行详细讲解,旨在帮助开发者更好地掌握Reader的使用方法。

Reader类
概述
Reader类是Java中用于读取字符流的抽象类。它是所有字符输入流的超类,提供了字符输入流读取时的基本功能。Reader类主要由三个类实现,分别是InputStreamReader、FileReader和CharArrayReader。

源代码解析
Reader类是一个抽象类,它的源代码定义如下:

public abstract class Reader implements Readable, Closeable {
...
}
其中,Reader实现了两个接口:Readable和Closeable。Readable接口中只定义了一个方法:

public interface Readable {
int read(CharBuffer cb) throws IOException;
}
而Closeable接口中也只定义了一个方法:

public interface Closeable extends AutoCloseable {
void close() throws IOException;
}
这两个接口的作用分别是提供读取字符和关闭资源的方法。

应用场景案例
Reader类通常用于读取文本文件中的数据。比如我们经常使用的BufferedReader就是Reader类的一个子类,用于逐行读取文本文件中的数据。除此之外,Reader还可用于读取网络数据、读取控制台输入等场景。

下面是几个 使用Reader 类的应用场景案例,同学们仅供参考:

  1. 读取文本文件
    使用 FileReader 类来读取文本文件很常见。例如可以使用 FileReader 和 BufferedReader 组合来读取一个文本文件并逐行输出:

复制代码
//1. 读取文本文件
public static void testReadFile(){
FileReader fileReader;
BufferedReader bufferedReader;
try {
fileReader = new FileReader("./template/fileTest.txt");
bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
fileReader.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
复制代码
通过上述案例,我们本地演示,结果可见如下:

  1. 读取网络资源
    可以使用 InputStreamReader 和 URL 类来读取网络资源,例如:

复制代码
//2. 读取网络资源
public static void testReadURL() throws IOException {
URL url = new URL("https://www.baidu.com/");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }

    br.close();
    isr.close();
    is.close();
}

public static void main(String[] args) throws IOException {
    testReadURL();
}

复制代码
通过上述案例,我们本地演示,结果可见如下:

  1. 读取字符串
    可以使用 StringReader 类来将一个字符串转换为字符流,例如:

复制代码

//3. 读取字符串

//代码效果参考:https://www.h3cw.com/sitemap/post.xml
public static void testReadStr() throws IOException {
String str = "Hello, World!!!";
StringReader stringReader = new StringReader(str);
int data;
while ((data = stringReader.read()) != -1) {
System.out.print((char) data);
}
stringReader.close();
}

public static void main(String[] args) throws IOException {
    testReadStr();
}

复制代码
通过上述案例,我们本地演示,结果可见如下:

通过介绍及演示以上三个比较常见的 Java 中运用 Reader 类的应用场景案例,通过使用 Reader 类的子类,可以方便地读取各种类型的字符流数据。如果你还有更多贴切生活或工作中的案例,欢迎评论区交流呀,独乐乐不如众乐乐。

利弊分析
优点
Reader类支持字符流的读取,可以准确地读取文本文件中的数据。
Reader类能够自动处理字符编码问题,在读取文件时能够自动转换编码方式。
可以通过Reader类的各个子类实现不同的功能,使用灵活。
缺点
Reader类读取数据的速度较慢,不适合读取二进制数据。
Reader类不能随机访问文件中的数据,只能逐行读取,读取大文件时效率较低。
Reader类的使用较为繁琐,需要通过缓冲区等方式来提高读取速度和效率。
类代码方法介绍
构造方法
protected Reader()
Reader类的默认构造方法。

方法
public int read() throws IOException
用处:读取单个字符,并返回该字符的ASCII码,如果到达流的末尾,返回-1。

public int read(char[] cbuf) throws IOException
用处:读取字符数组,返回读取的字符个数。

public int read(char[] cbuf, int offset, int length) throws IOException
用处:读取指定长度的字符数组,返回读取的字符个数。

public long skip(long n) throws IOException
用处:跳过n个字符(包括空格),返回实际跳过的字符数。

public boolean ready() throws IOException
用处:判断是否可以从流中读取字符,如果可以读取返回true。

public boolean markSupported()
用处:判断此流是否支持mark()操作。如果支持,则返回true,否则返回false。

public void mark(int readAheadLimit) throws IOException
用处:设置mark位置,并将输入流中的指针指向mark位置。如果该流不支持mark()操作,则抛出IOException异常。

public void reset() throws IOException
用处:将输入流中的指针重新指向mark位置。如果该流不支持reset()操作,则抛出IOException异常。

abstract public void close() throws IOException
用处:关闭该流并释放与之关联的所有资源。

测试用例
以下是一个使用Reader类读取文件的测试用例:

测试代码演示
复制代码
package com.example.javase.io.reader;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**

  • @author bug菌

  • @version 1.0

  • @date 2023/10/19 10:34
    */
    public class ReaderTest {

    public static void main(String[] args) throws IOException {
    File file = new File("./template/fileTest.txt");
    Reader reader = new FileReader(file);

     char[] buffer = new char[1024];
     int len;
     while ((len = reader.read(buffer)) != -1) {
         System.out.println(new String(buffer, 0, len));
     }
     reader.close();
    

    }
    }
    复制代码
    测试结果展示
    根据如上测试用例,我们来执行下main主函数进行测试读取文件的字符数据,结果展示如下截图:

通过控制台输出的内容与原文本内容进行对比,可得该测试用例运用Reader类正常读取文件内容,

代码解析
如上测试代码使用了Reader 类从文件中读取字符数据。如下来对该代码进行步骤解析,以帮助同学们加速理解。

首先,我们先创建一个 File 对象,指定要读取的文件路径,然后使用 FileReader 类将该文件读取到内存中,并返回 Reader 对象。然后使用 char[] 数组作为缓冲区,将数据从 Reader 中读取到缓冲区,并使用 String 类将缓冲区数据转化为字符串输出到控制台,直到所有数据都被读取完毕。最后,关闭 Reader 对象释放相关资源。整个读取过程非常简单,你们学会了吗?

全文小结
本文对Java中的Reader类进行了详细介绍,包括其简介、源代码解析、应用场景案例、优缺点分析、方法介绍及测试用例。通过本文的学习,我们可以更好地掌握Reader的使用方法,并在开发中合理使用Reader类。

总结
Reader类是Java中一个用于读取字符流的抽象类,它具有读取文本数据、自动处理字符编码等优点,并可通过其子类实现不同的功能。但是,Reader类读取数据的速度较慢,不适合读取二进制数据,而且不能随机访问文件中的数据。在使用Reader类时,要注意使用缓冲区等方式来提高读取速度和效率。最后,要注意关闭资源,避免资源泄漏问题的发生。

附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

点击关注,第一时间了解华为云新鲜技术~

分类: 程序员之家
标签: java , Reader类 , 数据读取
好文要顶 关注我 收藏该文 微信分享
华为云开发者联盟
粉丝 - 827 关注 - 1
+加关注
00
升级成为会员
« 上一篇: DWS临时内存不可用报错: memory temporarily unavailable
» 下一篇: 华为云GaussDB城市沙龙活动走进安徽,助力金融行业数字化转型
posted @ 2023-10-27 14:11 华为云开发者联盟 阅读(408) 评论(0) 编辑 收藏 举报
刷新评论刷新页面返回顶部
发表评论 升级成为园子VIP会员
编辑
预览
支持 Markdown

自动补全
退出 订阅评论 我的博客

[Ctrl+Enter快捷键提交]

【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】天翼云2核4G云服务器加购同规格数据库,3个月仅售21.7元
【推荐】2024阿里云超值优品季,精心为您准备的上云首选必备产品
【推荐】会员力量,点亮园子希望,期待您升级成为博客园VIP会员

编辑推荐:
· [WPF]数据绑定时为何会出现 StringFormat 失效
· OpenTelemetry 实战:从零实现应用指标监控
· 使用 asp.net core 8+vue3 实现高效音视频通话
· [kernel] 带着问题看源码 —— 脚本是如何被 execve 调用的
· 两个存在包名与类名均相同的Jar包,要在工程中同时使用怎么办?
阅读排行:
· 程序员失业日记4:半个月拿下4个offer
· .NET 摄像头采集
· 从代码到产品,我的IT职业成长之路
· 一个小小空格问题引起的bug
· 服务重启了,如何保证线程池中的数据不丢失?

标签:字符,读取,写入,throws,IOException,Reader,public
From: https://www.cnblogs.com/longshao2024/p/18390443

相关文章

  • C#应用实战,手把手教你如何:在日志中写入内容
    使用c#编写一个方法,该方法有一个形参。要求:1定义一个文件目录:D/MesData。如果该目录不存在,则创建一个目录。2读取目录下的MesLog.TXT文件,如果该文件不存在,则创建一个文件。3定义一个字符串str,它由当前时间以及方法的形参组成4将字符串str添加到MesLog.TXT文件内容的末尾......
  • 通过C# 读取PDF页面大小、方向、旋转角度
    在C#中读取PDF文件的页面大小、方向以及旋转角度,可以使用第三方库,因为.NET标准库本身并不直接支持处理PDF文件。最常用的库之一是iTextSharp,它是iText的.NET版本,一个开源的库,用于创建和操作PDF文件。以下是一个使用iTextSharp库来读取PDF页面大小、方向和旋转角度的基本示例:......
  • Goby 漏洞发布|Nacos Jraft 服务文件读取漏洞【已复现】
    漏洞名称:NacosJraft服务文件读取漏洞EnglishName:NacosJraftServicesFileReadVulnerabilityCVSScore:5.0漏洞描述:NACOS是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nac......
  • JavaIO 文件的读取,写入,复制,压缩,解压等...相关操作,持续更新
    1.文本文件的读取文本的读取,返回值是一个list,如果需要返回一整个string在while循环中使用StringBuilder.append 即可/***逐行读取文本**@paramfilePath文件路径*@returnList<String>*/publicstaticList<String>readTxtFile1......
  • 如何正确读取RTI中enum
    如何正确读取RTI中的enum背景假设录制的RTI数据保存.dat文件中,使用DBbrowserforSQLite查看.dat文件,其中包含了要读取的topic数据,这个topic对应的IDL中含义enum类型,假设其定义如下:moduleSample{enumState{UNKNOWN=-1,MANUAL=......
  • python基础(11文件读取)
    python系列文章目录python基础(01变量&数据类型&运算符)python基础(02序列共性)python基础(03列表和元组)python基础(04字符串&字典)python基础(05集合set)python基础(06控制语句)python基础(07函数)python基础(08类和对象)python基础(09闭包&装饰器)python基础(10异常处理)文章......
  • python读取配置文件&&简单封装 公共配置文件 config
    之前有做过把爬虫数据写到数据库中的练习,这次想把数据库信息抽离到一个ini配置文件中,这样做的好处在于可以在配置文件中添加多个数据库,方便切换(另外配置文件也可以添加诸如邮箱、url等信息)1.configparser模块python使用自带的configparser模块用来读取配置文件,配置文......
  • 【Python】将网格数据写入到VTK文件
    1.vtk文件格式根据官网进行总结vtk文件组成:5个部分.第一部分,第一行:表明文件版本.写"#vtkDataFileVersion2.0"就行第二部分,第二行:表明标题(title).随便写.第三部分,第三行:ASCII或者BINARY第四部分,开始定义datasetstructure.这部分用于描述数据集的几何和拓扑......
  • NRRD文件的读取及保存
    importnrrdimportnumpyasnp#读取.nrrd文件defread_and_save_nrrd(filename,save_path):#读取文件data,header=nrrd.read(filename)#打印数据和选项信息print("Data:",data)print("Options:",header)#保存数据到新......
  • QT/C++中的GDAL多线程应用(读取):发生的问题以及解决方案
    1.引言在使用GDAL库对TIF文件进行切割和创建瓦片金字塔时,为了提高创建效率,不得不考虑使用多线程处理。然而,在实际实现过程中,我遇到了许多问题。通过不断的尝试和优化,最终找到了有效的解决方案。本文将详细记录这一过程中的问题和解决方法。2.初始多线程尝试与问题2.1......