【java IO】IO体系结构 + File类详解

Java IO 从入门到深入(第一篇):IO体系结构 + File类详解


在 Java 开发中,IO(Input / Output) 是一个非常核心的知识体系。

几乎所有应用都会涉及 IO,例如:

  • 读取配置文件
  • 写日志
  • 文件上传下载
  • 网络通信
  • 数据持久化

但很多初学者学习 IO 时都会遇到一个问题:

Java IO 类太多,看起来非常混乱。

例如:

复制代码
InputStream
OutputStream
Reader
Writer
BufferedReader
FileInputStream
ObjectOutputStream
File
RandomAccessFile

如果没有理解 IO整体体系结构,很容易学一段忘一段。


一、什么是 IO?

IO 是:

复制代码
Input / Output

即:

复制代码
输入 / 输出

在计算机中:

类型 含义
Input 从外部读取数据
Output 向外部写入数据

例如:

复制代码
文件 → 程序   (输入)
程序 → 文件   (输出)

再比如:

复制代码
键盘 → 程序
程序 → 屏幕

本质上 IO 就是:

程序与外部资源之间的数据传输

这些外部资源包括:

复制代码
文件
网络
数据库
控制台
内存

二、Java IO 的核心思想

Java IO 的核心思想只有一句话:

数据以"流(Stream)"的方式进行传输

可以理解为:

复制代码
数据像水流一样流动

示意:

复制代码
文件  ----->  程序
      InputStream

程序  ----->  文件
      OutputStream

因此 Java 中有两个最基础的类:

复制代码
InputStream
OutputStream

三、Java IO 的体系结构

Java IO 可以分为 四大类

复制代码
Java IO
│
├── File
│
├── 字节流
│     InputStream
│     OutputStream
│
├── 字符流
│     Reader
│     Writer
│
└── 缓冲流 / 处理流

简单理解:

类型 作用
File 文件和目录操作
字节流 处理二进制数据
字符流 处理文本数据
缓冲流 提高 IO 性能

四、为什么要区分字节流和字符流?

这是 Java IO 的核心设计。

字节流

处理 二进制数据

例如:

复制代码
图片
视频
音频
压缩文件

单位:

复制代码
byte

字符流

处理 文本数据

例如:

复制代码
txt
json
xml
html

单位:

复制代码
char

总结:

类型 处理数据
字节流 二进制
字符流 文本

五、Java IO 学习路线

学习 IO 推荐顺序:

复制代码
File
↓
字节流
↓
字符流
↓
缓冲流
↓
对象流
↓
NIO

本篇先讲 File 类


六、File 类是什么?

File 是 Java IO 中最基础的类之一。

作用:

表示文件或目录的路径

注意:

复制代码
File 不表示文件内容
只表示文件路径

例如:

复制代码
D:/test/a.txt

源码:

java 复制代码
public class File implements Serializable, Comparable<File>

七、File 的创建

创建 File 对象:

java 复制代码
File file = new File("test.txt");

或者:

java 复制代码
File file = new File("D:/test/a.txt");

也可以:

java 复制代码
File file = new File("D:/test","a.txt");

注意:

复制代码
创建 File 对象
不会创建真实文件

八、创建文件

创建真实文件:

java 复制代码
file.createNewFile();

示例:

java 复制代码
import java.io.File;

public class Main {

    public static void main(String[] args) throws Exception {

        File file = new File("test.txt");

        if(!file.exists()){
            file.createNewFile();
        }

    }

}

九、创建目录

创建单级目录:

java 复制代码
file.mkdir();

创建多级目录:

java 复制代码
file.mkdirs();

示例:

java 复制代码
File dir = new File("D:/test/a/b");

dir.mkdirs();

十、判断文件信息

File 提供了很多方法。


判断是否存在

java 复制代码
file.exists();

判断是否是文件

java 复制代码
file.isFile();

判断是否是目录

java 复制代码
file.isDirectory();

获取文件大小

java 复制代码
file.length();

单位:

复制代码
字节

十一、获取文件信息

获取文件名:

java 复制代码
file.getName();

获取路径:

java 复制代码
file.getPath();

获取绝对路径:

java 复制代码
file.getAbsolutePath();

示例:

java 复制代码
File file = new File("test.txt");

System.out.println(file.getName());
System.out.println(file.getAbsolutePath());

十二、删除文件

删除文件:

java 复制代码
file.delete();

注意:

复制代码
删除不会进入回收站

删除目录要求:

复制代码
目录必须为空

十三、列出目录内容

获取目录文件列表:

java 复制代码
File dir = new File("D:/test");

File[] files = dir.listFiles();

for(File f : files){
    System.out.println(f.getName());
}

十四、File 的使用场景

File 通常用于:

1 文件管理

例如:

复制代码
创建文件
删除文件
遍历目录

2 配置文件读取

例如:

复制代码
读取 application.properties

3 日志系统

日志框架会使用 File 写日志。


4 文件上传下载

Web 系统:

复制代码
上传文件
保存文件

十五、File 常见易错点

1 File 不会创建文件

很多人误以为:

java 复制代码
File file = new File("a.txt");

文件已经创建。

实际上:

复制代码
没有创建

必须:

复制代码
createNewFile()

2 mkdir 与 mkdirs 区别

复制代码
mkdir  只能创建单级目录
mkdirs 可以创建多级目录

例如:

复制代码
a/b/c

必须使用:

复制代码
mkdirs

3 delete 删除目录要求为空

例如:

复制代码
test/
   a.txt

执行:

复制代码
delete()

会失败。


十六、IO 面试高频问题

1 File 能读取文件内容吗?

答案:

复制代码
不能

File 只能:

复制代码
表示路径
管理文件

读取内容需要:

复制代码
InputStream
Reader

2 File 和 Path 的区别

Java 7 之后:

复制代码
java.nio.file.Path

更推荐使用。

但很多旧项目仍使用 File。


3 为什么 File 既可以表示文件又可以表示目录?

因为 File 本质是:

复制代码
路径抽象

而不是文件对象。


十七、总结

本篇主要介绍了 Java IO 的整体结构

Java IO 可以分为:

复制代码
File
字节流
字符流
缓冲流

重点掌握:

File 的作用

复制代码
表示文件路径
管理文件

常用方法:

复制代码
exists()
createNewFile()
mkdir()
mkdirs()
delete()
listFiles()
相关推荐
海南java第二人2 小时前
Flink状态后端与容错机制深度剖析:TB级状态下的高可用实战
java·spring·flink
happymaker06262 小时前
JDBC(MySQL)——DAY05(DAO设计模式,JDBC事务处理,阿帕奇工具类)
数据库·mysql·设计模式
不光头强2 小时前
Java网络爬虫
java·爬虫·python
6+h2 小时前
【java IO】字符流详解
java·开发语言
2401_891482172 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
m0_743297422 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
ZHOUPUYU2 小时前
PHP文件处理与安全实战——从上传下载到高级操作的完整指南
开发语言·php
小年糕是糕手2 小时前
【35天从0开始备战蓝桥杯 -- 补充包】
开发语言·前端·数据结构·数据库·c++·算法·蓝桥杯
Navicat中国2 小时前
构建韧性数据库架构
数据库·数据库架构·navicat