Java--IO流详解 (上)--字符流

目录

IO流的概念

字符流

输入流

Reader核心方法

1.close()

2.mark(int readAheadLimit)

3.markSupported()

4.read()

5.read(char[] cbuf)

6.read(char[] cbuf, int off, int len)

7.read(CharBuffer target)

8.ready()

9.reset()

10.skip(long n)

Reader 的常用子类

1.FileReader

2.BufferedReader(高级)

3. StringReader

输出流

Writer 类的核心方法

1.close()

2.flush()

3.append(char c)

4.append(CharSequence csq)

5.append(CharSequence csq, int start, int end)

6.write(char[] cbuf):

7.write(char[] cbuf, int off, int len):

8.write(int c)

 9.write(String str)

10.write(String str, int off, int len)

Writer 的常用子类

1.FileWriter

2.BufferedWriter(高级)

3.StringWriter

字符流总结


在一篇帮你搞懂Java输入[内含IO流详解]_java 输入-CSDN博客 中简单介绍了有关IO流中有关字符流基础的一些常用方法,现在在此系统介绍一下有关IO流的概念。

IO流的概念

在 Java 中,流是用于在数据源(如文件、网络连接等)和程序之间传输数据的抽象概念。根据不同的分类标准,流可以分为不同的类型:

  • 按数据类型分类
    • 字节流:以字节(8 位)为单位进行数据传输,适用于处理所有类型的数据,包括文本、图像、音频、视频等。因为所有的数据在计算机中最终都是以字节形式存储的,所以字节流可以处理任何形式的二进制数据。
    • 字符流:以字符为单位进行数据传输,主要用于处理文本数据。字符流会根据指定的字符编码(如 UTF - 8、GBK 等)将字节数据转换为字符,方便对文本进行读写操作。通俗而言,我们能够读懂的都可以被认为是字符流。​​​​​​​
  • 按输入输出方向分类
    • 输入流:用于从数据源(如游戏程序、文件、网络连接等)读取数据到程序中。
    • 输出流:用于将程序中的数据写入到目标位置(如游戏程序、文件、网络连接等)。

这里的输入输出流的概念很容易搞混,可以通俗理解成输入输出是针对于“我们的程序”而言的,读取到程序就是输入,由程序提供数据就是输出。

字符流

输入流

Reader核心方法

Reader:是字符输入流的抽象基类,以下方法是其核心功能:

1.close()

关闭流并释放与之关联的所有资源。

reader.close();
2.mark(int readAheadLimit)

标记流中的当前位置,以便后续可以通过 reset() 方法返回到该位置。

reader.mark(100); // 标记当前位置,允许向前读取最多100个字符
3.markSupported()

判断此流是否支持 mark() 操作,返回 truefalse

if (reader.markSupported()) {reader.mark(100);
}
4.read()

读取单个字符,返回读取的字符的整数值,如果到达流末尾则返回 -1

int c = reader.read();
while (c != -1) {System.out.print((char) c);c = reader.read();
}
5.read(char[] cbuf)

将字符读入数组,返回实际读取的字符数。

char[] buffer = new char[1024];
int charsRead = reader.read(buffer);
System.out.println(new String(buffer, 0, charsRead));
6.read(char[] cbuf, int off, int len)

将字符读入数组的某一部分,返回实际读取的字符数。

char[] buffer = new char[1024];
int charsRead = reader.read(buffer, 0, 512);
System.out.println(new String(buffer, 0, charsRead));
7.read(CharBuffer target)

试图将字符读入指定的字符缓冲区。 

CharBuffer buffer = CharBuffer.allocate(1024);
reader.read(buffer);
buffer.flip();
System.out.println(buffer.toString());
8.ready()

判断是否可以从此流中读取数据,返回 true 表示可以读取。

if (reader.ready()) {System.out.println("Stream is ready to read.");
}
9.reset()

重置流,使流返回到最近一次调用 mark() 方法时的位置。 

reader.reset(); // 返回到标记的位置
10.skip(long n)

跳过指定数量的字符。

reader.skip(10); // 跳过10个字符

Reader 的常用子类

1.FileReader

从文件中读取字符流。

FileReader fileReader = new FileReader("example.txt");
2.BufferedReader(高级)

提供缓冲功能,提高读取效率。

BufferedReader:是一个高级的字符输入流,它在内部使用了缓冲区来提高读取效率。它提供了一个非常方便的方法 readLine() 用于按行读取文本数据,这在处理文本文件时非常实用。通常会将一个基础的字符输入流(如 FileReader)包装在 BufferedReader 中使用,示例代码如下:

BufferedReader bufferedReader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = bufferedReader.readLine()) != null) {System.out.println(line);
}
3. StringReader

从字符串中读取字符。

StringReader stringReader = new StringReader("Hello, World!");
char[] buffer = new char[10];
int length;
while ((length = stringReader.read(buffer)) != -1) {System.out.write(buffer, 0, length);
}

输出流

Writer 类的核心方法

1.close()

关闭流并释放资源。

writer.close();
2.flush()

刷新缓冲区,确保数据被写入。

writer.flush();
3.append(char c)

追加单个字符。

writer.append('a');
4.append(CharSequence csq)

追加字符序列。

writer.append("Hello");
​​​​​​​5.append(CharSequence csq, int start, int end)

将指定字符序列的子序列追加到输出中。

writer.append("HelloWorld", 0, 5); // 只追加 "Hello"
6.write(char[] cbuf)

写入字符数组。

char[] buffer = {'a', 'b', 'c'};
writer.write(buffer);
7.write(char[] cbuf, int off, int len)

写入字符数组的某一部分。

char[] buffer = {'a', 'b', 'c', 'd', 'e'};
writer.write(buffer, 1, 3); // 只写入 "bcd"
8.write(int c)

写入单个字符。

writer.write('a');
 9.write(String str)

写入字符串。

writer.write("Hello World");
10.write(String str, int off, int len)

写入字符串的某一部分。

writer.write("HelloWorld", 0, 5); // 只写入 "Hello"

Writer 的常用子类

1.FileWriter

将字符写入文件。

FileWriter fileWriter = new FileWriter("example.txt");
fileWriter.write("Hello World");
fileWriter.close();
2.BufferedWriter(高级)

提供缓冲功能,提高写入效率。

BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("example.txt"));
bufferedWriter.write("Hello");
bufferedWriter.newLine(); // 写入一个换行符
bufferedWriter.write("World");
bufferedWriter.close();
3.StringWriter

将字符写入字符串。

BufferedWriter:是一个高级的字符输出流,同样使用了缓冲区来提高写入效率。它提供了 newLine() 方法用于写入一个换行符,方便按行写入文本数据。通常会将一个基础的字符输出流(如 FileWriter)包装在 BufferedWriter 中使用,示例代码如下:

StringWriter stringWriter = new StringWriter();
stringWriter.write("Hello");
stringWriter.write(" World");
System.out.println(stringWriter.toString()); // 输出 "Hello World"

字符流总结

  • ReaderWriter 是字符流的核心抽象类(基础)。

  • FileReaderFileWriter 用于文件的字符读写。

  • BufferedReaderBufferedWriter 提供缓冲功能,优化读写性能(高级)。

  • StringReaderStringWriter 用于从字符串中读取或写入字符。

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

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

相关文章

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展,智能家居逐渐成为现代生活的一部分。在众多智能家居应用中,智能灯光控制系统尤为重要。通过语音控制和自动调节灯光,用户可以更便捷地操作家中的照明设备,提高生活的舒适度与便利性。本文将介绍一…

探讨使用ISVA代替“Open Liberty使用指南及微服务开发示例”中日志审计功能

在Open Liberty使用指南及开发示例(四)一文开始日志审计功能占有了一定的开发工作量,那么是否可以使用IBM Security Verify Access(ISVA)代替以节省开发工作?如果可行,那么以后各类应用的日志审…

STM32、GD32驱动TM1640原理图、源码分享

一、原理图分享 二、源码分享 /************************************************* * copyright: * author:Xupeng * date:2024-07-18 * description: **************************************************/ #include "smg.h"#define DBG_TAG "smg&…

Java ArrayList(单列集合)

ArrayList 是 Java 中最常用的一个集合类,它属于 java.util 包。ArrayList 实现了 List 接口,提供了动态数组的功能。与普通数组不同,ArrayList 在元素增删时会自动调整大小,因此它的大小是可变的。 1. ArrayList 的基本特性 动…

二次封装axios解决异步通信痛点

为了方便扩展,和增加配置的灵活性,这里将通过封装一个类来实现axios的二次封装,要实现的功能包括: 为请求传入自定义的配置,控制单次请求的不同行为在响应拦截器中对业务逻辑进行处理,根据业务约定的成功数据结构,返回业务数据对响应错误进行处理,配置显示对话框或消息形…

TOML介绍

0 Preface/Foreword TOML,一种配置文件格式。Toms Obvious Minimal Language. 1 介绍 TOML: Toms Obvious Minimal Language,“显而易见的最小化语言 ” JSON:不支持注释 YAML:过于复杂

python 大数据的优势

在SD-WAN技术与企业网络的应用场景中,结合大数据分析,Python能发挥出独特优势,这些优势主要体现在以下几个方面: - **数据收集与整合**:在SD-WAN网络中,分布着众多设备和链路,会产生海量的网络…

Linux命名管道与共享内存

命名管道与共享内存 命名管道介绍和基本使用 理解了匿名管道后,命名管道的理解就会变得容易。在前面使用匿名管道时可以发现,之所以可以匿名是因为由父进程创建,子进程拷贝所以子进程和父进程都可以看到这个管道。但是如果对于任意两个进程…

TCP 端口号为何位于首部前四个字节?协议设计的智慧与启示

知乎的一个问题很有意思:“为什么在TCP首部中要把TCP的端口号放入最开始的四个字节?” 这种问题很适合我这种搞历史的人,大年初一我给出了一个简短的解释,但仔细探究这个问题,我们将会获得 TCP/IP 被定义的过程。 文…

查看引脚电平

在Linux系统中,通过cat命令查看/sys/class/gpio/export文件并不能直接获取GPIO引脚的高低电平。/sys/class/gpio/export文件用于向系统请求导出(即启用)某个特定的GPIO引脚,而不是用于读取引脚的状态。 1.导出GPIO引脚&#xff1…

luoguP8764 [蓝桥杯 2021 国 BC] 二进制问题

luogu题目传送门 题目描述 小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗? 输入格式 输入一行包含两个整数 N 和 K。 输出格式 输出一个整数表示答案。 输入输出样例 输入 #1 7 2 输出 #1 3 说明/提示 对于…

qt的QSizePolicy的使用

使用 QSizePolicy 设置控件的伸缩因子 在 Qt 中,QSizePolicy 控制 控件如何在布局中伸缩。如果想要影响控件的大小调整行为,可以通过 QSizePolicy::setHorizontalStretch() 和 QSizePolicy::setVerticalStretch() 设置伸缩因子。 基本用法 假设我们有一个…

GLM库需要VS2013及以上

GLM库简介 GLM(OpenGL Mathematics)是一个C++数学库,它基于OpenGL Shading Language(GLSL)规范。 功能: 矩阵变换和四元数:GLM支持各种矩阵变换操作,包括平移、旋转和缩放。此外,它还提供了四元数支持,这对于处理3D旋转非常有用。 数据打包和随机数生成:除了基本…

八.springboot集成mybatis+druid数据库连接池

文章目录 前言一、添加必要依赖二、添加application-dev.yml配置三、添加mybatisdruid配置三、添加mybatis-config.xml四、测试使用1.在TestController中添加一个testMybatis2.在TestService中添加对应接口3.实现TestService4.最终项目结构5.测试接口 五、Druid监控功能总结 前…

FreeRTOS 知识点总结(一):基础概念与核心特性

FreeRTOS 是一款广泛应用于嵌入式领域的实时操作系统(RTOS),以其轻量级、开源性、高可裁剪性等特点,成为许多嵌入式开发项目的首选。本文将从基础概念、核心特性、任务管理等方面对 FreeRTOS 进行总结,帮助初学者快速入…

一文了解zookeeper

1.ZooKeeper是什么 简单来说,她是一个分布式的,开放源码的分布式应用程序协调服务 具体来说,他可以做如下事情: 分布式配置管理:ZooKeeper可以存储配置信息,应用程序可以动态读取配置信息。分布式同步&a…

游戏引擎学习第100天

仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天,我们开始了反射和环境贴图的工作,成功地根据法线显示了反射效果。然而,我们还没有实现反射向量的计算,导致反射交点的代…

MYSQL的管理备份

一、系统数据库 mysql数据库安装完成后,自带了四个数据库,具体作用如下: mysql:存储MySQL服务器正常运行所需的各种信息(时区、主从、用户、权限等); information_schema:提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等; performanc…

【时时三省】(C语言基础)简单的算法举例

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 判定2000—2500年中的每一年是否为闰年,并将结果输出。 本先分析闰年的条件: (1)能被4整除,但不能被100整除的年份都是闰年&…

基于单片机的智能奶茶机(论文+源码+图纸)

1总体架构设计 本课题为基于单片机的智能奶茶机设计,其系统架构上设计如图2.1所示,整个系统包括了DS18B20温度传感器、继电器模块、LCD液晶、蜂鸣器、按键、STC89C52单片机等器件,在功能上用户可以通过按键键控制选择甜度和添加物以及设置温度…