IO流

IO流

2026年3月11日·#java笔记本/java菜鸟java·1429 字 7 分钟
浏览量加载中...
AI 摘要- DeepSeek

嘿,别被“IO流”这名字唬住——它其实就是程序和文件之间传纸条的方式 😄 读个配置、存张图片、写段日志……全靠它悄悄搭桥。今天咱们不啃概念,就聊怎么让Java乖乖把数据“拿进来”又“送出去”,顺手避开那些删不掉的空目录、写不进的乱码、还有忘了close的坑。

一、 文件操作#

1.1 文件与文件流#

  • 文件:保存数据的地方。
  • 文件流:文件在程序中以流的形式进行操作。

1.2 创建文件对象 (File 类)#

  • 构造器:

    1. new File(String pathname):根据路径字符串构建。
      |500
      ​
  1. new File(File parent, String child):根据父目录文件对象+子路径构建。
  2. new File(String parent, String child):根据父目录字符串+子路径构建。

1.3 获取文件信息#

  • 常用方法:

    • getName():获取文件名。
    • getAbsolutePath():获取文件绝对路径。
    • getParent():获取文件父级目录。
    • length():获取文件大小(字节)。
    • exists():判断文件是否存在。
    • isFile():判断是否为文件。
    • isDirectory():判断是否为目录。

1.4 目录操作与文件删除#

  • mkdir():创建一级目录。
  • mkdirs():创建多级目录。
  • delete():删除空目录或​文件。

二、 IO流原理与分类#

2.1 原理#

  • I/O 指 Input/Output,用于数据传输。
  • Java 程序中,数据输入/输出以 “流 (stream)” 形式进行。
  • java.io 包提供各种流类和接口。
  • 输入:将外部数据(磁盘等)读入到程序(内存)。
  • 输出:将程序(内存)数据写出到外部设备(磁盘等)。

2.2 流的分类体系#

  1. 按操作数据单位:

    • 字节流 (8 bit) :用于处理二进制文件(如图片、视频、音频)。
    • 字符流 (按字符) :用于处理文本文件。
  2. 按数据流向:

    • 输入流:从数据源到程序。
    • 输出流:从程序到目的地。
  3. 按流的角色:

    • 节点流:直接从数据源/目的地读写数据。
    • 处理流(包装流) :对节点流进行包装,提供更强大的功能。

2.3 抽象基类与命名规律#

  • 所有流都派生自四个抽象基类:
抽象基类字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter
  • 命名规律:子类名以其父类名作为后缀(如 FileInputStream)。

三、 常用节点流#

3.1 字节输入流 FileInputStream#

  • 作用:从文件读取字节数据到程序。

  • 读取方式:

    1. read():每次读取一个字节,返回 int,到文件末尾返回 -1。
    2. read(byte[] b):每次读取最多 b.length 个字节到字节数组,返回实际读取的字节数,到文件末尾返回 -1。

3.2 字节输出流 FileOutputStream#

  • 作用:将程序的字节数据写入文件。

  • 写入方式:

    1. write(int b):写入一个字节。
    2. write(byte[] b):写入整个字节数组。
    3. write(byte[] b, int off, int len):写入字节数组的指定部分。
  • 构造器:

    • new FileOutputStream(filePath):覆盖写入。
    • new FileOutputStream(filePath, true):追加写入。
  • 注意:如果文件不存在,会自动创建(前提是目录存在)。

3.3 字符输入流 FileReader#

  • 作用:从文件读取字符数据到程序。

  • 读取方式(同 InputStream 思路,操作单位是 char):

    1. read():每次读取一个字符。
    2. read(char[] cbuf):每次读取多个字符到字符数组。

3.4 字符输出流 FileWriter#

  • 作用:将程序的字符数据写入文件。

  • 写入方式(同 OutputStream 思路):

    1. write(int c):写入一个字符。
    2. write(char[] cbuf) / write(String str):写入字符数组或字符串。
    3. write(String str, int off, int len):写入字符串的指定部分。
  • 重要​:使用 FileWriter 后,​必须关闭流 (close()) 或 ​刷新流 (flush()) ,数据才会真正写入文件。

四、 常用处理流(包装流)#

4.1 处理流概述#

  • 作用​:包装节点流,提供缓冲、便捷操作等功能,​不直接连接数据源。

  • 优势:

    1. 提高性能:通过内部缓冲区减少IO次数。
    2. 操作便捷:提供更方便的方法(如 readLine())。
  • 关闭:只需关闭最外层的处理流,底层会自动关闭节点流。

4.2 缓冲流(高效)#

  • BufferedReader / ​​BufferedWriter:

    • 包装字符流,提供缓冲。
    • readLine():按行读取文本,高效便捷。
    • newLine():写入一个行分隔符。
    • 注意​:只能用于处理​文本文件。
  • BufferedInputStream / ​​BufferedOutputStream:

    • 包装字节流,提供缓冲。
    • 用于处理​二进制文件(如图片、音频拷贝),效率更高。

4.3 对象流(序列化与反序列化)#

  • 作用​:保存和恢复对象的值和​数据类型。

  • ObjectOutputStream​:提供序列化功能,将对象写入文件。

  • ObjectInputStream​:提供反序列化功能,从文件读取对象。

  • 序列化要求:

    1. 被序列化的类必须实现 Serializable 接口(标记接口)。
    2. 建议添加 serialVersionUID 以提高版本兼容性。
    3. 序列化对象时,默认序列化所有属性(除了 static 和 transient 修饰的成员)。
    4. 序列化具有可继承性。
  • 注意事项:读写顺序必须一致。

4.4 转换流(解决编码问题)#

  • 作用​:在字节流和字符流之间进行转换,并可以​指定编码。
  • InputStreamReader:将 InputStream(字节输入流)包装成 Reader(字符输入流)。
  • OutputStreamWriter:将 OutputStream(字节输出流)包装成 Writer(字符输出流)。
  • 应用场景:处理纯文本数据时,使用字符流效率更高,并能有效解决中文乱码问题。

4.5 打印流#

  • PrintStream / ​PrintWriter:

    • 只有输出流,没有输入流。
    • 提供了一系列重载的 print() 和 println() 方法,输出非常方便。
    • System.out 就是 PrintStream 类型。

五、 Properties 类#

5.1 概述#

  • Properties 类继承自 Hashtable,是专门用于读写配置文件的集合类。
  • 配置文件格式​:键=值(键值对,无需空格,值默认String类型)。

5.2 常用方法#

  • load(InputStream inStream):从输入字节流加载属性列表(键值对)。
  • list(PrintStream out):将属性列表输出到指定打印流。
  • getProperty(String key):根据键获取值。
  • setProperty(String key, String value):设置键值对。
  • store(OutputStream out, String comments):将属性列表写入输出字节流(保存到文件)。

5.3 应用#

  • 用于读取 .properties 配置文件(如数据库连接信息)。
  • 可以方便地修改和保存配置。

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# AI绘图1# AI辅助开发2# Ajax7# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc4# CSS10# DeepSeek6# deepseek2# DELETE1# Docker5# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML9# HTTP10# ImageManager1# Java23# java13# JavaScript11# JavaWeb113# JDBC7# JSON2# JUnit1# LangChain25# Linux4# Logback1# Maven17# Muse Spark1# Mybatis1# MyBatis18# MySQL45# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python70# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot37# SpringMVC5# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue20# Waline3# Web3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端52# 动态1# 动漫1# 包1# 单词2# 博客8# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 后端48# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 实战4# 对象1# 导航栏1# 工具2# 布局2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程2# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常95# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试3# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 表单1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部署11# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 项目实战11# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]