当前位置: 首页 > article >正文

Java字节流详解FileInputStream和FileOutputStream

Java 字节流详解FileInputStream 和 FileOutputStream 从入门到实践一、前言在 Java 中文件的读写操作是最基础也是最高频的 I/O 场景之一。字节流Byte Stream作为 Java I/O 体系的两大分支之一负责处理所有二进制数据的传输图片、音频、视频以及任何非文本文件都离不开它。FileInputStream和FileOutputStream是字节流中最核心的两个实现类掌握它们就掌握了 Java 文件 I/O 的基石。本文将围绕这两个类的构造、核心方法、使用方式、底层原理以及常见坑点展开确保看完后能写出健壮的文件读写代码。二、字节流简介Java 的 I/O 流分为两大类字节流Byte Stream以InputStream/OutputStream为抽象父类按字节8 bit读写适合所有类型的文件。字符流Character Stream以Reader/Writer为抽象父类按字符16 bit读写适合纯文本文件。FileInputStream和FileOutputStream分别继承自InputStream和OutputStream是操作文件的直接入口。InputStream (抽象) └── FileInputStream ← 从文件读取字节 OutputStream (抽象) └── FileOutputStream ← 向文件写入字节三、核心 API 速览3.1 FileInputStream方法签名说明FileInputStream(String name)根据文件路径创建输入流FileInputStream(File file)根据 File 对象创建输入流int read()读取一个字节返回0~255的 int读到末尾返回-1int read(byte[] b)读取最多b.length个字节到数组返回实际读取的字节数int read(byte[] b, int off, int len)读取最多len个字节到数组的指定偏移位置long skip(long n)跳过并丢弃 n 个字节int available()返回可读的字节数估计值void close()关闭流释放系统资源3.2 FileOutputStream方法签名说明FileOutputStream(String name)根据路径创建输出流覆盖模式FileOutputStream(String name, boolean append)指定是否追加模式FileOutputStream(File file)根据 File 对象创建输出流void write(int b)写入一个字节只取 int 的低 8 位void write(byte[] b)写入整个字节数组void write(byte[] b, int off, int len)写入数组的一部分void flush()刷新缓冲区字节流 flush 是空实现但遵循约定void close()关闭流释放系统资源四、代码实现4.1 基础用法单个字节读写不推荐用于大文件importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;publicclassFileInputStreamDemo{publicstaticvoidmain(String[]args)throwsIOException{// 用 try-with-resources 自动关闭流JDK 7try(FileInputStreamfisnewFileInputStream(source.txt);FileOutputStreamfosnewFileOutputStream(dest.txt)){intdata;while((datafis.read())!-1){fos.write(data);}}System.out.println(文件复制完成);}}缺点每次只读写一个字节每次 read()/write() 都涉及一次 native 调用大文件下性能极差。4.2 推荐用法字节数组批量读写importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;publicclassFileCopyWithBuffer{publicstaticvoidmain(String[]args){Stringsourcephoto.jpg;Stringdestphoto_copy.jpg;try(FileInputStreamfisnewFileInputStream(source);FileOutputStreamfosnewFileOutputStream(dest)){byte[]buffernewbyte[8192];// 8KB 缓冲区intlen;while((lenfis.read(buffer))!-1){fos.write(buffer,0,len);// 注意必须使用 write(buffer, 0, len) 而不是 write(buffer)// 因为最后一次读取可能不足 8192 字节}System.out.println(复制完成);}catch(IOExceptione){System.err.println(文件操作失败: e.getMessage());}}}4.3 追加模式写入importjava.io.FileOutputStream;importjava.io.IOException;importjava.nio.charset.StandardCharsets;publicclassFileAppendDemo{publicstaticvoidmain(String[]args){try(FileOutputStreamfosnewFileOutputStream(log.txt,true)){Stringline[System.currentTimeMillis()] 用户登录成功\n;fos.write(line.getBytes(StandardCharsets.UTF_8));}catch(IOExceptione){e.printStackTrace();}}}FileOutputStream的第二个参数append为true时写入内容追加到文件末尾而非覆盖。五、执行流程与底层原理以read(byte[])为例一次读取的完整链路如下Java 应用层调用FileInputStream.read(byte[])JDK 内部调用native readBytes方法JNI进入 C 层调用操作系统的ReadFileWindows或read()Linux/POSIX内核从磁盘读取数据到内核空间缓冲区内核 → 用户空间数据从内核缓冲区拷贝到 Java 传入的 byte 数组返回实际读取的字节数-1 表示 EOF这个过程中涉及一次用户态 ↔ 内核态切换和一次数据拷贝。这也是为什么批量读减少 native 调用次数比逐字节读快几个数量级的原因。六、常见问题与注意事项6.1 流必须关闭未关闭流会导致文件句柄泄漏最终可能触发Too many open files异常。✅ 正确做法优先使用try-with-resourcesJDK 7它会自动调用 close()即使在异常发生时也能正确关闭。6.2write(byte[])和write(byte[], 0, len)的区别fos.write(buffer)会把整个 buffer 写入文件。如果最后一次读取不足 buffer 长度会写入上一次残留的脏数据。永远使用write(buffer, 0, len)。6.4 字符编码问题字节流不涉及编码转换写入什么字节就读出什么字节。如果要在字节流上处理文本必须外部指定字符集// 写入时指定编码fos.write(中文.getBytes(StandardCharsets.UTF_8));// 读取时指定编码StringtextnewString(bytes,StandardCharsets.UTF_8);6.5 FileNotFoundException 不等于文件不存在FileInputStream构造时如果文件不存在会抛FileNotFoundException。但如果文件是个目录或者路径包含不可读的目录同一异常也会抛出。不要只把它当成文件不存在来处理。七、最佳实践能用字符流的场景纯文本用字符流否则用字节流。FileReader / FileWriter 内部封装了字节转换更省心。大文件优先用 BufferedInputStream / BufferedOutputStream包装它们在内部自动维护更大的缓冲区减少 native 调用。版本兼容检查— FileInputStream 和 FileOutputStream 从 JDK 1.0 就有不存在兼容性问题。Files.copy() 可以替代— 对于单纯复制文件java.nio.file.Files.copy()一行代码搞定底层使用更高效的 FileChannel。// NIO 一行复制Files.copy(Path.of(source.txt),Path.of(dest.txt),StandardCopyOption.REPLACE_EXISTING);八、总结FileInputStream和FileOutputStream是 Java 字节流体系中最基础的文件读写类支持所有文件类型。批量读写字节数组比逐字节读写性能高出几个数量级。始终使用try-with-resources确保流被正确关闭。写入时注意write(buffer, 0, len)而非write(buffer)避免脏数据。纯文本场景优先考虑FileReader/FileWriter或 NIO 的Files工具类。掌握字节流是理解 Java I/O 体系的第一步也是编写高可靠文件操作代码的必备基础。推荐标签Java IOFileInputStreamFileOutputStream字节流Java 文件操作

相关文章:

Java字节流详解FileInputStream和FileOutputStream

Java 字节流详解:FileInputStream 和 FileOutputStream 从入门到实践 一、前言 在 Java 中,文件的读写操作是最基础也是最高频的 I/O 场景之一。字节流(Byte Stream)作为 Java I/O 体系的两大分支之一,负责处理所有二进…...

AI智能体开发实战:从开源Cookbook到生产级应用构建指南

1. 项目概述:一份面向开发者的AI实战手册最近在整理自己的技术工具箱时,我重新审视了Dave Ebbelaar维护的“AI Cookbook”项目。这并非一个需要你从零开始部署的复杂系统,而是一个开源的、由代码片段和教程组成的集合库。它的核心价值在于&am…...

Kapitan配置管理:基于Jsonnet与Jinja2的多环境云原生配置实践

1. 项目概述:为什么我们需要Kapitan这样的配置管理工具?在云原生和基础设施即代码(IaC)的时代,我们手里的配置文件正以前所未有的速度膨胀。Kubernetes的YAML清单、Terraform的HCL文件、Helm的Chart、Ansible的Playboo…...

沉淀仓核心配件(H 管)安装与作用

以下技术要点是南京比德园艺服务有限公司创作,内容如下:H 管是沉淀仓的核心配件,南京比德园艺所有鱼池项目的沉淀仓均强制标配 H 管。H 管的核心作用是分散水流,避免进水直冲底部翻起已沉淀的杂质;稳定水流速度&#x…...

编程入门:if和switch分支结构

一、if分支1.基本结构:(1)if(布尔表达式){执行语句} 执行原理:如果布尔表达式的结果为true,则执行{}中内容,如果为false,则不执行{}中的内容。不论花括号中的语句是否执…...

《AI大模型应用开发实战从入门到精通共60篇》041、异步编程:用asyncio提升LLM应用的并发性能

041 异步编程:用asyncio提升LLM应用的并发性能 从一次线上事故说起 凌晨两点,告警电话把我从床上拽起来。监控显示我们的LLM对话服务响应时间从200ms飙到了8秒,CPU负载却只有30%。查日志发现,每次用户请求都在等上游的OpenAI接口返…...

避开“毒王”分子:药物化学家如何利用警示子结构(SA)库提前规避研发雷区

药物化学家的结构排雷指南:如何利用警示子结构规避研发风险 在药物研发的漫长征程中,化学家们常常面临一个残酷的现实:约90%的候选药物最终未能通过临床试验,其中近半数折戟于安全性问题。那些看似微小的分子片段——一个苯环上的…...

小龙虾算法COA实战:调参指南与在CEC2005测试函数上的表现分析

小龙虾优化算法COA实战:参数调优与性能评估全解析 在智能优化算法的研究领域,生物启发式算法因其独特的搜索机制和解决复杂问题的能力而备受关注。小龙虾优化算法(Crayfish Optimization Algorithm, COA)作为2023年提出的新型智能…...

Monica 部署指南:自建个人 CRM,记录人际关系的私人助手

Monica 部署指南:自建个人 CRM,记录人际关系的私人助手 Monica 是一个开源的个人 CRM(客户关系管理)工具,但它的目标不是商业客户,而是你生活里真正重要的人——朋友、家人、同事。它帮你记录每个人的生日、联系方式、共同话题、上次见面说了什么,让你成为一个更有心的…...

BetterGI:基于计算机视觉的原神智能辅助工具深度解析

BetterGI:基于计算机视觉的原神智能辅助工具深度解析 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自…...

南派三叔《盗墓笔记》小说1-9卷全txt电子版

《盗墓笔记》是一部由南派三叔创作的长篇探险悬疑小说,讲述了一个普通青年吴邪在偶然得到一本古老笔记后,与经验丰富的盗墓者胖子、神秘莫测的张起灵等人一起踏上探索古墓、追寻秘密的旅程。今天特别为大家整理分享《盗墓笔记》全套9卷,txt电…...

DDrawCompat解决方案:让Windows 11完美运行DirectX 1-7经典游戏

DDrawCompat解决方案:让Windows 11完美运行DirectX 1-7经典游戏 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/…...

百度网盘秒传脚本完整指南:永久文件分享的终极解决方案

百度网盘秒传脚本完整指南:永久文件分享的终极解决方案 【免费下载链接】rapid-upload-userscript-doc 秒传链接提取脚本 - 文档&教程 项目地址: https://gitcode.com/gh_mirrors/ra/rapid-upload-userscript-doc 你是否曾因百度网盘分享链接失效而烦恼&…...

避开这些坑!OpenMV4颜色阈值调试保姆级指南(附Lab颜色空间工具)

OpenMV4颜色阈值调试实战:从Lab空间原理到多环境适配技巧 调试颜色阈值是OpenMV开发中最令人头疼的环节之一。你可能遇到过这种情况:明明在实验室调试完美的色块识别代码,拿到室外就完全失效;或者同一套阈值参数,早上能…...

RTMP视频流的帧格式分析

RTMP(Real-Time Messaging Protocol)是基于 TCP 的协议,其底层传输的数据实际上封装了 FLV(Flash Video)格式的 Tag。在 RTMP 流中,数据被切分成一个个 Chunk(块)进行发送。为了让你…...

ok-ww终极指南:基于图像识别的鸣潮自动化战斗完整解决方案

ok-ww终极指南:基于图像识别的鸣潮自动化战斗完整解决方案 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 在《鸣潮》这…...

如何永久保存微信聊天记录:终极数据备份与年度报告生成指南

如何永久保存微信聊天记录:终极数据备份与年度报告生成指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/…...

杀戮尖塔2mod二次元猎宝

关于《杀戮尖塔2》(Slay the Spire 2)的 “二次元猎宝”(Anime Treasure Hunter)Mod,该作品目前是社区中关注度较高的综合性扩展 Mod。 镜像从夸克下载 1. 作者 该 Mod 通常由 国内 Mod 开发团队/个人“五月&#x…...

5个AI象棋实战技巧:从新手到高手的Vin象棋完全指南

5个AI象棋实战技巧:从新手到高手的Vin象棋完全指南 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 你是否在象棋对弈中屡战屡败,面…...

2025届必备的AI辅助论文网站推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对用户输入特定主题或关键词,AI写作软件能依托先进自然语言处理技术&#xff…...

将 Claude Code 编程助手对接至 Taotoken 的配置指南

将 Claude Code 编程助手对接至 Taotoken 的配置指南 1. 准备工作 在开始配置前,请确保已具备以下条件: 有效的 Taotoken API Key(可在控制台「API 密钥」页面生成)目标模型 ID(可在 Taotoken 模型广场查看 Anthrop…...

Linux(CentOS 6/7)搭建 vsFTPD 服务器及排错实战(SELinux 导致无法切换目录)

环境说明虚拟机系统版本为CentOS 7,IP地址配置为静态IP(如192.168.1.100),确保网络连通性正常。安装 vsFTPD方法一:通过yum安装vsftpd服务:[rootlocalhost Packages]# yum install -y vsftpd验证安装是否成…...

C++版本的opencv速度比gradle版本快5-30倍

结论先说:性能差距非常大!C 版远优于 Gradle 依赖版你用的 implementation org.opencv:opencv:4.9.0 是 OpenCV Java 版,和 C 原生集成 性能差距至少 5~20 倍,实时图像处理(相机、视频)甚至能差 30 倍以上。…...

量子纠缠源同步丢失?C语言底层驱动调试日记(含逻辑分析仪抓取的1.25Gbps QKD时钟域切换波形+源码注释版)

更多请点击: https://intelliparadigm.com 第一章:量子纠缠源同步丢失?C语言底层驱动调试日记(含逻辑分析仪抓取的1.25Gbps QKD时钟域切换波形源码注释版) 凌晨三点十七分,QKD(量子密钥分发&am…...

OpenCore Legacy Patcher:让旧Mac免费升级最新macOS的终极指南

OpenCore Legacy Patcher:让旧Mac免费升级最新macOS的终极指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款革命…...

提高记忆力就能提高成绩是真的吗破解流言 科学认知记忆力与成绩的关系

提高记忆力就能提高成绩是真的吗破解流言的核心结论非常明确:这个说法是片面的流言,记忆力只是影响成绩的众多因素之一,提高记忆力并不必然带来成绩提升,成绩提升是多维度因素共同作用的结果。 提高记忆力就能提高成绩是真的吗 底…...

anlogic pl中断驱动配置

TD工程,一秒给IN5拉高一次电平 设备树而言 / {plint {compatible = "milianke,plint";interrupt-parent = <&gic>;interrupts = <0 82 4>; }; };/ {plint {compatible = "milianke,plint";interrupt-parent = <&gic>;interrup…...

React/Next.js自定义光标库@muybuen/cursor深度实践指南

1. 项目概述&#xff1a;为现代Web应用注入灵魂的交互光标在构建现代Web应用&#xff0c;特别是基于React或Next.js的富交互产品时&#xff0c;我们常常会不自觉地忽略一个最基础却又最直接的交互媒介——鼠标光标。默认的箭头指针千篇一律&#xff0c;它只是系统的一个指示器&…...

三维战场环境下的多无人机智能协同作战系统:基于混合GA-PSO的威胁规避与时间协同路径规划(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

(一区复现)基于强化学习和优化反步法的水面舰艇自适应跟踪控制研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...