【Java】IO流
Java IO流是Java中处理输入输出的核心机制,通过不同的流类型实现了对数据的高效读写。
一、IO流的分类
1. 按数据方向
- 输入流(Input Stream):从数据源(如文件、网络等)读取数据。
- 输出流(Output Stream):向目标(如文件、网络等)写入数据。
2. 按数据类型
- 字节流(Byte Streams):以字节(8位)为单位操作,处理所有二进制数据(如图片、音频、视频等)。
- 基类:InputStream 和 OutputStream。
- 字符流(Character Streams):以字符(16位Unicode)为单位操作,专门处理文本数据。
- 基类:Reader 和 Writer。
3. 按功能
- 节点流(Node Streams):直接操作数据源(如文件流)。
- 处理流(Processing Streams):对现有流进行包装,增强功能(如缓冲、转换格式)。
二、核心类与常用流
1. 字节流
- InputStream(输入流)
- FileInputStream:从文件读取字节。
- ByteArrayInputStream:从字节数组读取。
- BufferedInputStream:提供缓冲功能,减少IO次数。
- DataInputStream:读取Java基本数据类型(如int、double)。
- ObjectInputStream:反序列化对象(需实现Serializable接口)。
- OutputStream(输出流)
- FileOutputStream:向文件写入字节。
- ByteArrayOutputStream:写入字节数组。
- BufferedOutputStream:缓冲输出流。
- DataOutputStream:写入Java基本数据类型。
- ObjectOutputStream:序列化对象。
2. 字符流
- Reader(字符输入流)
- FileReader:读取文本文件。
- BufferedReader:提供缓冲功能,支持readLine()逐行读取。
- InputStreamReader:将字节流转换为字符流(可指定编码)。
- Writer(字符输出流)
- FileWriter:写入文本文件。
- BufferedWriter:缓冲输出流。
- OutputStreamWriter:将字符流转换为字节流(可指定编码)。
3. 转换流
- InputStreamReader 和 OutputStreamWriter:用于字节流与字符流的转换,支持字符编码(如UTF-8、GBK)。
三、示例代码
1. 文件读写
- 字节流示例(复制文件):
try (FileInputStream fis = new FileInputStream("input.jpg");FileOutputStream fos = new FileOutputStream("output.jpg")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);} } - 字符流示例(逐行读取文本):
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);} }
2. 对象序列化
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.obj"))) {oos.writeObject(new Person("Alice", 30));
}// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.obj"))) {Person p = (Person) ois.readObject();
}
3. 缓冲流提升性能
// 使用缓冲流复制文件(效率更高)
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {int data;while ((data = bis.read()) != -1) {bos.write(data);}
}
四、IO流的使用场景
IO流主要用于处理输入和输出操作,适用于以下场景:
- 文件读写:通过IO流可以读取和写入文件中的数据,如读取配置文件、写入日志等。
- 网络通信:通过IO流可以进行网络数据的传输和接收,如Socket通信、HTTP请求等。
- 数据库操作:通过IO流可以将数据读取到内存中,或将内存中的数据写入到数据库中。
- 文本处理:通过IO流可以读取和写入文本文件,进行文本处理和操作。
五、高级特性
- NIO(New I/O)
- Java 1.4引入的java.nio包,提供非阻塞IO、通道(Channel)、缓冲区(Buffer)等机制,适合高并发场景。
- 核心类:ByteBuffer, FileChannel, Selector。
- 自动资源管理(try-with-resources)
- Java 7+支持自动关闭实现了AutoCloseable接口的资源:
try (Resource1 r1 = new Resource1(); Resource2 r2 = new Resource2()) {// 使用资源 } // 自动调用close()
- Java 7+支持自动关闭实现了AutoCloseable接口的资源:
六、常见问题
- 字节流 vs 字符流
- 字节流处理二进制数据,字符流处理文本(自动处理编码)。
- 文本文件建议用字符流,避免编码问题。
- 选择缓冲流
- 频繁读写时,缓冲流通过减少IO次数提升性能。
- 字符编码问题
- 使用InputStreamReader/OutputStreamWriter时需指定编码(如UTF-8)。
七、总结
Java IO流通过分层设计(节点流+处理流)和装饰器模式,灵活支持多种数据操作场景。掌握字节流、字符流及缓冲机制是高效处理IO的关键,同时注意资源释放和编码问题。对于高性能需求,可进一步学习NIO框架。
相关文章:
【Java】IO流
Java IO流是Java中处理输入输出的核心机制,通过不同的流类型实现了对数据的高效读写。 一、IO流的分类 1. 按数据方向 输入流(Input Stream):从数据源(如文件、网络等)读取数据。输出流(Outp…...
HTML第三节
一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…...
Visual Studio 2022安装问题解决,提示无法安装Microsoft.VisualStudio.Community.Msi
表现现象为:安装完后提示无法安装Microsoft.VisualStudio.Community.Msi,无法正常开发C项目 查看日志,大概显示: xxx ReturnCode1316 xxxxx 消息详细信息: 指定的帐户已存在。 试了网上所有的办法都没用,反复尝试&…...
【代码分享】基于IRM和RRT*的无人机路径规划方法详解与Matlab实现
基于IRM和RRT*的无人机路径规划方法详解与Matlab实现 1. IRM与RRT*的概述及优势 IRM(Influence Region Map)通过建模障碍物的影响区域,量化环境中的安全风险,为RRT算法提供启发式引导。RRT(Rapidly-exploring Random…...
MybatisPlus从入门到精通
一、MyBatis-Plus核心特性 无侵入性 在MyBatis基础上增强,无需修改原有代码即可使用。自动化CRUD 内置通用Mapper和Service,减少80%单表操作代码。Lambda表达式 支持Lambda形式的条件构造,避免字段名硬编码错误。主键策略 支持雪花算法&…...
el-table input textarea 文本域 自适应高度,切换分页滚动失效处理办法
场景: el-table 表格 需要 input类型是 textarea 高度是自适应,第一页数据都是单行数据 不会产生滚动条,但是第二页数据是多行数据 会产生滚动条, bug: 第一页切换到第二页 第二页滚动条无法展示 解决办法:直接修改样…...
基于Windows11的DockerDesktop安装和布署方法简介
基于Windows11的DockerDesktop安装和布署方法简介 一、下载安装Docker docker 下载地址 https://www.docker.com/ Download Docker Desktop 选择Download for Winodws AMD64下载Docker Desktop Installer.exe 双点击 Docker Desktop Installer.exe 进行安装 测试Docker安装是…...
ffmpeg源码编译支持cuda
1.安装cuda CUDA Toolkit 11.3 Downloads | NVIDIA Developer 在选择组件的时候,将CUDA中的Nsight VSE和Visual Studio Integration取消勾选 不然会安装失败 2.编译ffmpeg 把cuda编译宏定义开启,再编译avcodec 3.编译livavutil报错struct "Cuda…...
动漫短剧开发公司,短剧小程序搭建快速上线
在当今快节奏的生活里,人们的娱乐方式愈发多元,而动漫短剧作为新兴娱乐形式,正以独特魅力迅速崛起,成为娱乐市场的耀眼新星。近年来,动漫短剧市场呈爆发式增长,吸引众多创作者与观众目光。 从市场规模来看…...
《2025软件测试工程师面试》接口测试篇
基础概念 什么是接口测试? 接口测试是测试系统组件间接口的一种测试,主要用于检测外部系统和内部系统之间以及各个子系统之间的交互点。测试的重点是检查数据的交换、传递和控制管理的过程,以及系统间的相互逻辑依赖关系等。 接口测试的优势是什么? 接口测试具有规范性与扩…...
嵌入式学习第二十三天--网络及TCP
进程通信的方式: 同一主机 传统 system V 不同主机 网络 --- 解决不同主机间 的进程间通信 网络 (通信) //1.物理层面 --- 联通(通路) //卫星 2G 3G 4G 5G 星链 (千帆) //2.逻辑层面 --- 通路(软件) MAC os LINUX …...
Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验
目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…...
SQLAlchemy系列教程:基本数据类型及自定义类型
在SQLAlchemy、Python SQL工具包和ORM中定义模型时,理解基本数据类型至关重要。本教程提供了在SQLAlchemy模型中有效使用内置基本类型的指南。 SQLAlchemy中的基本类型 SQLAlchemy支持一组与SQL数据库类型一致的基本数据类型。SQLAlchemy中的每种类型都为各种SQL类…...
【Wireshark 02】抓包过滤方法
一、官方教程 Wireshark 官网文档 : Wireshark User’s Guide 二、显示过滤器 2.1、 “数据包列表”窗格的弹出过滤菜单 例如,源ip地址作为过滤选项,右击源ip->prepare as filter-> 选中 点击选中完,显示过滤器&#…...
ES怎么查询大于10000条数据
在Elasticsearch(ES)中,默认情况下,查询结果的最大返回条数是10,000条。如果你需要查询超过10,000条数据,可以通过以下几种方式来实现: 1. 使用 scroll API scroll API 适用于需要处理大量数据的场景&…...
《几何原本》命题I.8
《几何原本》命题I.8 如果两个三角形有三边对应相等,那么这两个三角形的所有对应角亦相等。 若 A B D E , A C D F , B C E F ABDE,ACDF,BCEF ABDE,ACDF,BCEF 将 △ A B C \triangle ABC △ABC 平移至 △ D E F \triangle DEF △DEF,使 B C BC …...
课程2. 机器学习方法论
课程2. 机器学习方法论 训练算法并评估其质量将样本分成训练和测试。分层 交叉验证方法sklearn 接口算法模型训练模型的应用质量评估 数据预处理标准缩放Violinplot 数据集使用模型Pipeline 在上一讲中,我们讨论了机器学习专家面临的挑战。无论解决的问题类型和解决…...
ioday2----->标准io函数
思维导图: 练习: 1将当前的时间写入到time. txt的文件中,如果ctrlc退出之后,在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次执行程序 4.2022…...
SQL注入练习场:PHPStudy+SQLI-LABS靶场搭建教程(零基础友好版)
注意:文中涉及演示均为模拟测试,切勿用于真实环境,任何未授权测试都是违法行为! 一、环境准备 下载PHPStudy 官网下载地址:https://www.xp.cn/php-study(选择Windows版) 安装时建议选择自定…...
【笔记ing】python
1 Python基础概念及环境搭建 1.1 python简介及发展史 之父Guido van Rossum。ABC语言的替代品。Python提供了高效的数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释性语言的本质,使之成为多数平台上写脚本和快速开发应…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
