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() 操作,返回 true 或 false。
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"
字符流总结
-
Reader和Writer是字符流的核心抽象类(基础)。 -
FileReader和FileWriter用于文件的字符读写。 -
BufferedReader和BufferedWriter提供缓冲功能,优化读写性能(高级)。 -
StringReader和StringWriter用于从字符串中读取或写入字符。
相关文章:
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 的常用…...
大模型语言简介
大模型语言能做什么 信息提取 将长段文字中的信息抽取出来并且以结构化的方式输出。相比起传统NLP的方式,大模型在泛化能力上有非常大的提升,并且开发成本要低2个数量级。应用场景包括:论文论点论据提取、用户画像提取、舆情分析、病例结构…...
手动配置IP
手动配置IP,需要考虑四个配置项: 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址:格式表现为点分十进制,如192.168.254.1 子网掩码:用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…...
Golang 进阶训练营
一、Golang 的 slice、map、channel 1.1 slice vs array a : make([]int, 100) //切片 b : [100]int{} //数组array需指明长度,长度为常量且不可改变 array长度为其类型中的组成部分(给参数为长度100的数组的方法传长度为101的会报错) array在…...
2-使用wifidog实现portal
wifidog是openwrt上面实现portal认证的一个开源工具,从网关端到服务器都帮你搭建好,通过学习wifidog的原理,后面就可以改造成自己需要的逻辑。 1. openwrt安装wifidog 添加源 vim 14.07/feeds.conf.defaultsrc-git wifidog https://github.c…...
Spring Boot + ShardingSphere 踩坑记
最近在准备秋招,偷了个轮子项目之后想改个分表,于是有了这篇文章。 省流:请使用shardingsphere-jdbc 5.5.2,并根据官方5.5.2版本文档进行配置,不要使用starter。此外,如果希望使用INTERVAL分片算法&#x…...
AI时代前端开发的创造力:解放还是束缚?
在人工智能(AI)快速发展的时代,AI技术的影响已经渗透到各个领域,从医疗保健到金融服务,再到创意产业。AI工具的出现,为前端开发带来了前所未有的效率提升,但也引发了人们对创造力的担忧…...
有哪些免费的SEO软件优化工具
随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...
FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案
作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 基于AOP的数据字典实现…...
在Vue中,JavaScript数组常用方法,添加,插入,查找,删除等整理
在Vue中,JavaScript数组常用,添加,插入,查找,删除等整理 1.splice()方法可以直接修改原数组,通过指定要删除元素的索引来删除它。 例: let index // 要删除的元素的索引; this.array.splice(i…...
vue知识点2
1.methods和mounted的区别 methods是定义方法,不涉及到调用 mounted涉及到操作 所以methods后面是:,mounted后面是() 2.介绍一下emit的用法 如果子控件要调用父页面的方法,在父页面的子控件引用处&…...
node.js + html调用ChatGPTApi实现Ai网站demo(带源码)
文章目录 前言一、demo演示二、node.js 使用步骤1.引入库2.引入包 前端HTML调用接口和UI所有文件总结 前言 关注博主,学习每天一个小demo 今天是Ai对话网站 又到了每天一个小demo的时候咯,前面我写了多人实时对话demo、和视频转换demo,今天…...
14.Python生成器、迭代器、闭包、装饰器、元类、垃圾回收、内建函数
在 Python 中,生成器、迭代器、闭包、装饰器、元类、垃圾回收和内建函数是一些重要的概念和功能,它们对于编写高效、灵活的代码非常重要。下面我们逐一详细介绍这些概念及其用法。 1. 生成器(Generator) 生成器是一个函数&#…...
STM32+Proteus+DS18B20数码管仿真实验
1. 实验准备 硬件方面: 了解 STM32 单片机的基本原理和使用方法,本实验可选用常见的 STM32F103 系列。熟悉 DS18B20 温度传感器的工作原理和通信协议(单总线协议)。数码管可选用共阴极或共阳极数码管,用于显示温度值。…...
Vulhub靶机 ActiveMQ 反序列化漏洞(CVE-2015-5254)(渗透测试详解)
一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 漏洞版本:Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0 二、访问靶机IP 8161端口 默认账户密码 admin/admin,登录 此时qucues事件为空 1、使用jmet-0.1.0-all.jar工具将…...
ConcurrentHashMap扩容
目录 一、tryPreSize方法-初始化数组 二、tryPreSize方法-扩容标识戳 三、transfer方法-构建新数组 四、transfer方法-迁移数据 五、transfer方法-lastRun机制 六、helpTransfer方法-协助扩容 三种触发方式 达到了扩容的阈值 一、tryPreSize方法-初始化数组 // 扩容前…...
2025年二级建造师报名流程图解
2025年二级建造师报名时间!附报名流程! ⏰️已公布25年二建考试时间的省份如下: ️4月19日、20日考试的城市有:贵州 ️5月10日、11日考试的城市有:湖北、陕西、宁夏、甘肃、福建、浙江、江西、黑龙江、河南、湖南、…...
【自学笔记】人工智能基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 人工智能重点知识点总览一、基础概念与原理1.1 人工智能定义与发展1.2 算法与数据结构1.3 数学基础 二、机器学习2.1 监督学习2.2 无监督学习2.3 强化学习 三、深度…...
hexo 魔改 | 修改卡片透明度
hexo 魔改 | 修改卡片透明度 ** 博客食物用更佳 博客地址 ** 这是笔者自己瞎倒腾的。作为前端菜鸡一枚,大佬们随便看看就好~ 我用的主题是 butterfly 4.12.0 分析 通过开发者工具可以看出来卡片的背景和 --card-bg 变量有关 再在 sources 下的 css 文件夹下的…...
Golang的并发编程案例详解
Golang的并发编程案例详解 一、并发编程概述 并发编程是指程序中有多个独立的执行线索,并且这些线索在时间上是重叠的。在 Golang 中,并发是其核心特性之一,通过 goroutine 和 channel 来支持并发编程,使得程序可以更高效地利用计…...
【升级】阿里云对象存储 HTTPS 根证书升级公告
--时间打败一切...
贪心算法与动态规划的区别
贪心算法:每一步都选择当前最优解,期望通过局部最优达到全局最优。 动态规划:通过分解问题为子问题,存储并重用子问题的解,避免重复计算。 最简单的JS ACM代码举例 贪心算法:找零问题 function greed…...
策略模式-小结
总结一下看到的策略模式: A:一个含有一个方法的接口 B:具体的实行方式行为1,2,3,实现上面的接口。 C:一个环境类(或者上下文类),形式可以是:工厂模式,构造器注入模式,枚举模式。 …...
TDengine 性能测试工具 taosBenchmark
简介工具获取运行 无参数模式命令行模式配置文件模式 命令行参数配置文件参数 通用配置参数写入配置参数 数据库相关超级表相关标签列与数据列写入行为相关 查询配置参数 执行指定查询语句查询超级表 订阅配置参数数据类型对照表 配置文件示例 写入 JSON 示例查询 JSON 示例订阅…...
硬件学习笔记--41 电磁兼容试验-5 射频场感应的传导干扰试验介绍
目录 电磁兼容试验-射频场感应的传导干扰试验介绍 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验-射频场感应的传导干扰试验介绍 驻留时间是在规定频率下影响量施加的持续时间。被试设备(EUT)在经受扫频频带的电磁影响量或电磁干扰的情况下&a…...
泛型 类 接口 方法 通配符
泛型 泛型类 what: 类型参数化 why use: 1. 输出时候是object类型 而不是真正类型转化麻烦 import java.util.ArrayList; import java.util.List;public class ObjectExample {public static void main(String[] args) {List<Object> list new ArrayLi…...
文字转语音(三)FreeTTS实现
项目中有相关的功能,就简单研究了一下。 说明 FreeTTS 是一个基于 Java 的开源文本转语音(TTS)引擎,旨在将文字内容转换为自然语音输出。 FreeTTS 适合对 英文语音质量要求低、预算有限且需要离线运行 的场景,但若需…...
STM32 RTC 实时时钟说明
目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…...
Open-R1 项目代码文件的详细剖析
目录 1. configs.py 功能概述 关键代码与细节 2. evaluate.py 功能概述 关键代码与细节 3. generate.py 功能概述 关键代码与细节 4. grpo.py 功能概述 关键代码与细节 5. rewards.py 功能概述 关键代码与细节 6. sft.py 功能概述 关键代码与细节 安装 训练…...
Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)
Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1) import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.HardwareRenderer import android.graphics.PixelFormat import android.graphic…...
