Java 的 I/O 流是什么? 📅 发布时间:2026/7/15 8:37:33 👁️ 浏览次数: Java 的 I/O 流Input/Output Stream是 Java 中用于处理输入和输出操作的核心机制。它提供了一种统一的方式来读取和写入数据无论数据源是文件、网络连接、内存还是其他设备。I/O 流的基本概念I/O 流可以看作是数据的流动管道输入流从数据源读取数据到程序中输出流从程序写入数据到目标位置I/O 流的分类体系1.按数据流向分类// 输入流 - 读取数据InputStream,Reader// 输出流 - 写入数据OutputStream,Writer2.按数据类型分类// 字节流 - 处理二进制数据8位字节InputStream,OutputStream// 字符流 - 处理文本数据16位字符Reader,Writer主要 I/O 流类字节流Byte StreamsInputStream 常用子类FileInputStream// 从文件读取字节ByteArrayInputStream// 从字节数组读取BufferedInputStream// 带缓冲的输入流DataInputStream// 读取基本数据类型ObjectInputStream// 读取对象序列化OutputStream 常用子类FileOutputStream// 向文件写入字节ByteArrayOutputStream// 向字节数组写入BufferedOutputStream// 带缓冲的输出流DataOutputStream// 写入基本数据类型ObjectOutputStream// 写入对象序列化PrintStream// 格式化输出字符流Character StreamsReader 常用子类FileReader// 从文件读取字符CharArrayReader// 从字符数组读取BufferedReader// 带缓冲的字符输入流InputStreamReader// 字节流到字符流的桥梁Writer 常用子类FileWriter// 向文件写入字符CharArrayWriter// 向字符数组写入BufferedWriter// 带缓冲的字符输出流OutputStreamWriter// 字符流到字节流的桥梁PrintWriter// 格式化字符输出基本使用示例1.文件复制字节流try(InputStreaminnewFileInputStream(source.txt);OutputStreamoutnewFileOutputStream(target.txt)){byte[]buffernewbyte[1024];intbytesRead;while((bytesReadin.read(buffer))!-1){out.write(buffer,0,bytesRead);}}2.文本文件读写字符流// 读取文本文件try(BufferedReaderreadernewBufferedReader(newFileReader(input.txt))){Stringline;while((linereader.readLine())!null){System.out.println(line);}}// 写入文本文件try(BufferedWriterwriternewBufferedWriter(newFileWriter(output.txt))){writer.write(Hello, World!);writer.newLine();writer.write(这是第二行);}3.带缓冲的高效读写// 高效文件复制try(BufferedInputStreambisnewBufferedInputStream(newFileInputStream(source.jpg));BufferedOutputStreambosnewBufferedOutputStream(newFileOutputStream(target.jpg))){byte[]buffernewbyte[8192];// 8KB缓冲区intbytesRead;while((bytesReadbis.read(buffer))!-1){bos.write(buffer,0,bytesRead);}}高级特性1.装饰器模式Java I/O 使用装饰器模式可以灵活组合功能// 多层包装每层添加不同功能DataInputStreamdisnewDataInputStream(newBufferedInputStream(newFileInputStream(data.bin)));2.序列化与反序列化// 对象序列化写入try(ObjectOutputStreamoosnewObjectOutputStream(newFileOutputStream(user.dat))){UserusernewUser(张三,25);oos.writeObject(user);}// 对象反序列化读取try(ObjectInputStreamoisnewObjectInputStream(newFileInputStream(user.dat))){Useruser(User)ois.readObject();System.out.println(user.getName());}3.NIONew I/OJava NIO 提供了更高效的 I/O 操作// 使用 NIO 进行文件复制PathsourcePaths.get(source.txt);PathtargetPaths.get(target.txt);Files.copy(source,target,StandardCopyOption.REPLACE_EXISTING);// 使用 Channel 和 Buffertry(FileChannelinChannelFileChannel.open(source);FileChanneloutChannelFileChannel.open(target,StandardOpenOption.CREATE,StandardOpenOption.WRITE)){ByteBufferbufferByteBuffer.allocate(8192);while(inChannel.read(buffer)!-1){buffer.flip();// 切换为读模式outChannel.write(buffer);buffer.clear();// 清空缓冲区}}try-with-resources 自动资源管理Java 7 引入的 try-with-resources 语法确保流正确关闭// 传统方式需要手动关闭FileInputStreamfisnull;try{fisnewFileInputStream(file.txt);// 使用流}finally{if(fis!null){fis.close();// 必须手动关闭}}// try-with-resources自动关闭try(FileInputStreamfisnewFileInputStream(file.txt);FileOutputStreamfosnewFileOutputStream(output.txt)){// 使用流自动关闭}实际应用场景1.配置文件读取PropertiespropsnewProperties();try(InputStreamisgetClass().getResourceAsStream(/config.properties)){props.load(is);Stringurlprops.getProperty(database.url);}2.网络通信// 简单的 HTTP 客户端try(SocketsocketnewSocket(example.com,80);PrintWriteroutnewPrintWriter(socket.getOutputStream(),true);BufferedReaderinnewBufferedReader(newInputStreamReader(socket.getInputStream()))){out.println(GET / HTTP/1.1);out.println(Host: example.com);out.println();Stringresponse;while((responsein.readLine())!null){System.out.println(response);}}3.数据加密传输// 使用加密流try(CipherInputStreamcisnewCipherInputStream(newFileInputStream(encrypted.dat),cipher);ObjectInputStreamoisnewObjectInputStream(cis)){SecretDatadata(SecretData)ois.readObject();}性能优化建议使用缓冲流BufferedInputStream/BufferedOutputStream提高性能合理设置缓冲区大小通常 4KB-8KB 为宜及时关闭流使用 try-with-resources 避免资源泄漏考虑使用 NIO对于高并发场景NIO 性能更好批量操作尽量使用数组进行批量读写总结Java I/O 流的主要特点统一的接口所有 I/O 操作都基于流的概念灵活的扩展通过装饰器模式组合不同功能类型安全字节流和字符流明确区分资源管理try-with-resources 确保资源正确释放高性能缓冲机制和 NIO 提供高效操作I/O 流是 Java 编程中不可或缺的基础组件几乎所有的数据持久化和传输操作都依赖于它。
Java 运行时异常和编译时异常之间的区别是什么? Java 中的异常分为两大类:运行时异常和编译时异常(也称为检查型异常)。它们在处理方式、继承层次和使用场景上有重要区别。 异常层次结构 Throwable ├── Error(错误,不处理) └── Exception࿰… 2026/7/14 16:02:12
图论——最短路Dijkstra算法 Dijkstra算法:给定一个源点,求解从源点到每个点的最短路径长度。单源最短路径算法。 适用范围:有向图、边的权值没有负数普通堆实现的Dijkstra算法最普遍、最常用:a.节点弹出过就忽略 b.节点没弹出过,让其它没弹出节点… 2026/7/11 12:48:38
【GLM-5 陪练式前端新手入门】第四篇:卡片布局 —— 让个人主页内容更有层次 【GLM-5 陪练式前端新手入门】第四篇:卡片布局 —— 让个人主页内容更有层次 目录 【GLM-5 陪练式前端新手入门】第四篇:卡片布局 —— 让个人主页内容更有层次 1 项目背景:给个人主页填充 “内容卡片” 2 AI 赋能:向 GLM-5 提… 2026/7/13 11:40:17
compose2nix 安全特性解析:集成 sops-nix 和 agenix 进行秘密管理 compose2nix 安全特性解析:集成 sops-nix 和 agenix 进行秘密管理 【免费下载链接】compose2nix Generate a NixOS config from a Docker Compose project. 项目地址: https://gitcode.com/gh_mirrors/co/compose2nix compose2nix 是一款强大的工具ÿ… 2026/7/15 8:36:32
C++策略模式实战:从算法解耦到电商促销系统设计 1. 策略模式:从“硬编码”到“可插拔”的思维跃迁 如果你写过C,大概率遇到过这样的场景:一个类里塞满了 if-else 或者 switch-case ,就为了处理同一类问题的不同算法。比如,一个支付模块,根据用户选择的… 2026/7/15 8:34:32
网盘直链解析技术实战:突破限速的浏览器脚本解决方案 网盘直链解析技术实战:突破限速的浏览器脚本解决方案 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 在云存储服务普及的今天,网盘直链下载助手已成为技术用户突破下载… 2026/7/15 8:30:24
Hacker Podcast前端架构深度剖析:Next.js + Tailwind CSS + shadcn/ui的完美组合 Hacker Podcast前端架构深度剖析:Next.js Tailwind CSS shadcn/ui的完美组合 Hacker Podcast是一个基于AI的Hacker News中文播客项目,每天自动抓取Hacker News热门文章,通过AI生成中文总结并转换为播客内容。该项目采用了Next.js、Tailwin… 2026/7/15 8:28:24
STM32F103 HAL库+FATFS文件系统KEIL工程:SD卡读写、目录管理、带中文注释与烧录指南 本文还有配套的精品资源,点击获取 简介:一套开箱即用的STM32F103 FATFS文件系统实现方案,基于ST官方HAL库构建,适配KEIL MDK-ARM开发环境。工程已集成SD卡(SPI/SDIO模式)或SPI Flash的底层驱动ÿ… 2026/7/15 8:28:24
KLara未来路线图:卡巴斯基GReAT团队揭秘下一代恶意软件狩猎功能 KLara未来路线图:卡巴斯基GReAT团队揭秘下一代恶意软件狩猎功能 【免费下载链接】klara Kasperskys GReAT KLara 项目地址: https://gitcode.com/gh_mirrors/kl/klara 在网络安全威胁日益复杂的今天,恶意软件狩猎工具已成为安全研究人员的必备利器… 2026/7/15 8:26:24
行星减速机的工作原理是什么?从齿轮运动关系到减速比计算 一、行星齿轮机构的组成 标准行星齿轮机构主要包括: 太阳轮; 行星轮; 内齿圈; 行星架。 太阳轮位于机构中心。 多个行星轮围绕太阳轮均匀布置,行星轮内侧与太阳轮外啮合,外侧与内齿圈内啮合。 行星轮通过轴… 2026/7/15 0:03:00
阅读Java开源框架源码的心得分享! 前几日闲来无事有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做… 2026/7/15 0:03:00
【LINUX】驱动 【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】 2026/7/15 0:07:01
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41