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

Java IO与File类学习笔记:从文件操作到各类流体系梳理

一、File 类:不仅仅是个文件对象

File 类和 IO 流的关系。必须明确一点:File 类只是文件或目录路径名的抽象表示,它本身不具备读写数据的能力。
核心作用:它是操作文件系统(创建、删除、重命名、查询属性)的入口。
常用 API:exists() 判断是否存在,mkdirs() 创建多级目录,listFiles() 获取子文件列表。
注意点:在不同操作系统下(Windows vs Linux),路径分隔符的处理要格外小心,推荐使用 File.separator 保持跨平台兼容性。

二、流的分类体系

按流向分:
输入流 (Input/Reader):数据从外部(硬盘、网络)流向程序内存。
输出流 (Output/Writer):数据从程序内存流向外部。
按处理单位分(重点):
字节流 (Stream):以 byte (8位) 为单位。它是“万能流”,能处理图片、视频、音频等二进制文件。基类是 InputStream 和 OutputStream。
字符流 (Reader/Writer):以 char (16位) 为单位。它是“文本专用流”,内部自带编码转换机制,处理中文文本时比字节流更方便。基类是 Reader 和 Writer。

三、节点流 vs 处理流:装饰器模式的经典应用

节点流:直接连接数据源(如文件)。例如 FileInputStream。它们就像一根直接插在水桶里的水管。
处理流(包装流):不直接连数据源,而是“套”在节点流外面。例如 BufferedInputStream。

多套一层原因:
为了增强功能。最典型的就是缓冲流。
原生字节流读写是一个字节一个字节地搬运,效率极低。加上 Buffered 前缀后,它在内存中开辟了一块缓冲区(默认 8KB),一次性读取一批数据,大幅减少了磁盘 IO 次数,性能提升显著。

代码实战 Tip:
永远不要直接使用裸的 FileInputStream 去读大文件,需养成习惯:
new BufferedInputStream(new FileInputStream(file))

四、转换流:解决乱码的钥匙

在处理文本时,我们经常会遇到编码不一致的问题(比如文件是 GBK,程序是 UTF-8)。这时候就需要转换流:
InputStreamReader:字节 -> 字符(输入时的桥梁)
OutputStreamWriter:字符 -> 字节(输出时的桥梁)
它们允许在构造流的时候指定字符集(Charset),从而精准控制数据的编码和解码过程,是从底层解决中文乱码问题的关键手段。

五、对象序列化:让对象“活”在硬盘上

普通的流只能传文字或数字,如果想把一个 Java 对象(比如一个 User 对象)直接保存到文件里,或者通过网络发送给另一台服务器,就需要用到对象流 (ObjectInputStream /ObjectOutputStream)。
核心机制:
将对象的状态转换成字节序列(序列化),并在需要时还原(反序列化)。

避坑指南:
被序列化的类必须实现 Serializable 接口(这是一个标记接口,没有方法)。
版本控制:强烈建议手动定义 private static final long serialVersionUID。如果不定义,编译器会自动生成,一旦你修改了类的结构(加了个字段),自动生成的 ID 就会变,导致反序列化时报错 InvalidClassException。
安全性:敏感字段(如密码)可以用 transient 关键字修饰,使其不被序列化。

六、总结与建议

Java IO 流虽然类多,但逻辑很清晰:
先确定方向(读还是写)。
再确定数据类型(是纯文本还是二进制)。
最后考虑是否需要增强功能(加缓冲、转编码、序列化)。

http://www.zskr.cn/news/1449800.html

相关文章:

  • 【PC】[吾爱大神原创汉化] 开源PDF编辑器 KillerPDF v1.4.1汉化修改版
  • 别再让第三方库拖后腿!手把手教你用DependencyCheck给Maven项目做安全体检(附Jenkins集成)
  • 深度解析:索尼DPT-RP1电子纸底层破解与系统定制技术内幕
  • AI产品经理这条路,到底该怎么走?一份从零到精通的实战路线
  • 手把手教你用MATLAB给回归模型打分:从SSE到R方的完整计算与解读
  • AI通过图灵测试:技术实质、社会影响与未来应对策略
  • 基于Arduino与XOD可视化编程的智能植物监护系统设计与实现
  • 电子入门实践:从欧姆定律到并联电路,手把手搭建LED烽火台
  • Doherty功放设计进阶:从对称到非对称,再到多峰值的ADS仿真全攻略
  • 保姆级避坑指南:在Win11上搞定OMNeT++ 5.4.1、SUMO 0.30.0和Veins 4.7.1车联网仿真环境
  • 终极抖音下载指南:3分钟搞定无水印视频批量下载
  • DIY MIDI转CV接口:基于Arduino与MCP4728的模块合成器核心
  • 思科GRE隧道通了但业务不通?从抓包分析到故障排查的完整指南
  • 告别Xcode!用Homebrew在macOS上安装最新版GCC的保姆级教程(含环境变量配置)
  • 存储器层次结构——高速缓存存储器
  • 别再让电机乱转了!用Arduino Mega2560 + TB6612驱动MG513,手把手教你实现精准PWM调速与正反转控制
  • AI驱动网络安全实战:从威胁检测到自动化响应的架构与挑战
  • 语料蒸馏:从海量文档到结构化知识资产的工程实践
  • 从飞机上网到水下机器人:盘点LiFi(可见光通信)那些意想不到的硬核应用场景
  • 电阻式与电容式土壤湿度传感器对比:原理、校准与物联网应用实践
  • C/C++ 基础笔记(五)
  • SQL学习日志 Day_3 :(SELECT查询语句入门)
  • JWT令牌在多端跨域场景下的安全访问校验实践
  • mpv.net 终极指南:Windows平台高性能媒体播放器完整配置与实战技巧
  • IDEA装了LiteFlowX插件后,我写规则文件再也没翻过文档(智能提示+跳转真香)
  • 如何5分钟搭建个人音乐库:洛雪音乐聚合音源终极指南
  • 别再只看风速了!固定翼新手选飞行天气,这3个APP和2个关键数据更重要
  • IPXWrapper完整指南:让Windows 10/11完美运行经典游戏联机
  • 鸣潮模组终极指南:15+功能解锁,彻底改变你的游戏体验
  • 电路设计入门:从元器件到实战项目,零基础掌握电子制作核心技能