当前位置: 首页 > 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.jsqmd.com/news/938424/

相关文章:

  • 别再让第三方库拖后腿!手把手教你用DependencyCheck给Maven项目做安全体检(附Jenkins集成)
  • 【PC】[吾爱大神原创汉化] 开源PDF编辑器 KillerPDF v1.4.1汉化修改版
  • 深度解析:索尼DPT-RP1电子纸底层破解与系统定制技术内幕
  • AI模型越权调用摄像头、门禁与报警系统?3步阻断供应链级渗透,附可审计配置模板
  • AI产品经理这条路,到底该怎么走?一份从零到精通的实战路线
  • InfluxDB 2.x权限管理入门:如何用influx CLI安全地创建Token、用户和Bucket(附配置文件生成)
  • 3分钟搭建Windows直播服务器:nginx-rtmp-win32零基础教程
  • 手把手教你用MATLAB给回归模型打分:从SSE到R方的完整计算与解读
  • Akagi:免费开源麻将AI辅助工具终极指南,轻松提升你的雀魂水平
  • 降AIGC神器实测!AI率92%暴降至5%!实测10款降AIGC网站!学生党狂喜! - 降AI小能手
  • AI通过图灵测试:技术实质、社会影响与未来应对策略
  • 基于Arduino与XOD可视化编程的智能植物监护系统设计与实现
  • Libre Barcode免费开源条码字体:如何快速生成专业条码的完整指南
  • OpenWrt有线中继组网实操:除了KVR,这些高级设置项你真的理解了吗?(含NAS ID、R0KH密钥详解)
  • 数据仓库智能化升级迫在眉睫,你还在用传统调度?3类企业已全面切换AI协同引擎
  • 抖音内容批量下载终极指南:3分钟掌握无水印素材获取技巧
  • 4. 注意力机制介绍_2
  • 电子入门实践:从欧姆定律到并联电路,手把手搭建LED烽火台
  • Doherty功放设计进阶:从对称到非对称,再到多峰值的ADS仿真全攻略
  • Agent Harness Engineering综述:一篇读懂 AI Agent 真正的工程瓶颈
  • 保姆级避坑指南:在Win11上搞定OMNeT++ 5.4.1、SUMO 0.30.0和Veins 4.7.1车联网仿真环境
  • 告别‘搜索不到’:用Cheat Engine教程1-6关,彻底搞懂‘未知初始值’、‘浮点数’和‘指针’的扫描技巧
  • 别再死记硬背公式了!用5分钟搞懂电感‘伏秒平衡’,开关电源设计不再懵
  • 金橙子二次开发避坑指南:MarkEzd.dll调用时常见的5个错误及解决方法(EzCad2/LMC1)
  • 2026年重庆除甲醛,选对价格实惠的靠谱公司 - GrowthUME
  • 双非硕士75天逆袭!拿下字节大模型Agent暑期实习,我的转行全公开!
  • PL-2303驱动终极修复指南:3步解决Windows 10代码10错误
  • 终极抖音下载指南:3分钟搞定无水印视频批量下载
  • # 20251901 2024-2025-2 《网络攻防实践》实验十
  • DIY MIDI转CV接口:基于Arduino与MCP4728的模块合成器核心