【Java 入门 Day24】 IO 流上篇:字节流全家桶,文件传输的 “数据线宇宙” 家人们谁懂啊IO 流刚接触直接看懵又是字节又是字符缓冲、对象序列化一堆名词像拆开一堆杂乱数据线分不清用途。今天先啃字节流这块硬骨头用大白话 网络梗给你捋顺看完再也不会分不清读写、缓冲、序列化一、IO 流到底是啥内存和硬盘之间的传输管道IO 全称输入输出流全部放在java.io包里。 把流理解成数据线JVM 内存是你的手机硬盘文件、外部设备是电脑 / U 盘数据线负责双向传数据。三种分类方式面试必背按流向分以内存为参照物输入流读U 盘→手机把外部文件数据读到内存InputStream / Reader输出流写手机→U 盘把内存数据存进外部文件OutputStream / Writer按传输单位分字节流以 byte 字节为单位全能选手图片、视频、压缩包、文档全都能操作后缀InputStream/OutputStream字符流以字符 char 为单位专精 txt、java、html 纯文本处理音视频直接翻车后缀Reader/Writer按功能分节点流原生裸数据线只能基础读写直接绑定文件File 开头过滤流带快充缓冲、特殊功能的升级数据线套在节点流外面增强性能二、字节流顶层父类抽象类不能 newInputStream所有字节输入流爸爸核心动作read()读数据OutputStream所有字节输出流爸爸核心动作write()写数据三、字节节点流FileInputStream / FileOutputStream开发核心相当于直接插文件的原生数据线操作本地文件读写。1. FileOutputStream 文件字节输出流写文件三种构造方法用法分绝对路径、相对路径、追加 / 覆盖模式new FileOutputStream(E:/test/a.txt)绝对路径文件不存在自动新建但上级文件夹不存在直接报 FileNotFoundException系统找不到路径new FileOutputStream(a.txt)相对路径项目根目录找文件new FileOutputStream(c.txt,false)第二个布尔参数true 追加内容false 覆盖原有内容默认覆盖三个写方法write(int n)写入单个字节write(byte[] bs)一次性写入整个字节数组write(byte[] bs,int off,int len)数组截取一段写入close()用完必须关流释放系统资源不关会资源泄漏2. FileInputStream 文件字节输入流读文件构造new FileInputStream(file/d.txt)重点文件不存在不会自动创建直接抛找不到文件异常三个读方法read()一次读 1 个字节读到文件末尾返回 - 1循环读取标配java运行FileInputStream fis new FileInputStream(test.txt); while(true){ int n fis.read(); if(n -1) break; System.out.print((char)n); }read(byte[] bs)批量读取字节进数组返回本次读到的长度末尾返回 - 1read(byte[] bs,int off,int len)限定数组区间读取小总结File 输入输出流组合就是文件复制、上传下载底层原理所有文件拷贝工具底层全靠它俩。四、字节过滤流功能升级的快充数据线1. Buffered 缓冲流BufferedInputStream / BufferedOutputStream痛点原生节点流每次读写都访问硬盘频繁读写巨卡像反复插拔 U 盘传文件。 缓冲流自带内存缓冲区攒满一整块数据再一次性读写大幅减少磁盘访问速度起飞。 关键两个方法区别flush()强制把缓冲区剩余数据刷进文件缓冲区清空流还能继续用close()关流前自动执行 flush缓冲区清空流直接报废不能再操作 触发自动刷盘缓冲区装满时自动写入磁盘。2. Data 数据流DataInputStream / DataOutputStream专门读写 8 大基本数据类型存数字、布尔值专用配套读写顺序不能乱。 方法writeInt()/writeByte()/readInt()/readBoolean()3. 对象流ObjectInputStream / ObjectOutputStream面试重中之重主打对象序列化把 Java 对象丢进流存到文件 / 网络传输相当于给人物打包快递。核心方法writeObject(Object obj)序列化对象写入文件Object readObject()从文件读取还原对象读到文件尾抛EOFException序列化硬性规则踩坑高频点要序列化的类必须实现 Serializable 标记接口不实现直接报 NotSerializable 不可序列化异常transient修饰的字段会被直接忽略不参与序列化比如密码、临时缓存数据对象里包含自定义类成员成员类也必须实现 Serializable集合存自定义对象自定义类同样要实现该接口对比 PrintWriterObject 流是完整对象打包PrintWriter 只调用 toString 存文字不需要序列化接口本期小结字节流是 IO 万能工具不管什么格式文件都能操作节点流做基础读写缓冲流提速数据流存基础类型对象流打包对象序列化。下一篇咱们拆解字符流、桥转换流、File 文件工具类搞定文本读写、乱码、文件夹递归遍历