文件操作和 IO(一):文件基础知识 文件系统操作 => File类
目录
1. 什么是文件
1.1 概念
1.2 硬盘, 内存, 寄存器之间的区别
1.3 机械硬盘和固态硬盘
2. 文件路径
2.1 绝对路径
2.2 相对路径
3. 文件分类
4. File 类
4.1 属性
4.2 构造方法
4.3 方法
1. 什么是文件
1.1 概念
- 狭义上的文件: 保存在硬盘上的文件
- 广义的上的文件: 操作系统进行资源管理的一种机制. (很多软件/硬件资源, 抽象成文件来表示)
我们主要针对的是狭义上的文件.

注意:
文件夹也是 文件!!
其实 "文件夹" 是我们口中通俗的一个说法, 用专业术语来讲 "文件夹" 其实是 目录(directory).
文件 都是保存在硬盘上的, 其实不止是文件, 包括 MySQL 存储的数据时, 也是保存在硬盘上.
而我们是不能够直接操作硬盘的, 只能通过文件来间接操作硬盘.
其实, 不止是硬盘能够存储数据, 包括内存, cpu 寄存器也也是可以存储数据的, 这里来聊一聊它们三者的区别~
1.2 硬盘, 内存, 寄存器之间的区别
| 存储空间 | 访问速度 | 成本 | 持久化 | |
| 硬盘 | 很大 (TB级别) | 很慢 | 便宜. 1TB 固态硬盘, 300-400左右. 机械硬盘更便宜. | 持久化存储, 断电后不会丢失数据. |
| 内存 | 小 (16GB, 32GB) | 快 (比固态硬盘快了几百上千倍) | 贵. 16GB 的比较新的内存, 400-500左右. | 不能持久化 |
| 寄存器 | 非常小 (不到1 KB) | 非常快 (比内存快了几百上千倍) | 很贵. cpu 寄存器不单卖~ | 不能持久化 |
1.3 机械硬盘和固态硬盘
其中, 硬盘又分为机械硬盘和固态硬盘.
- 机械硬盘, 通常读写速度, 1s 几百 MB.
- 固态硬盘, 通常读写速度, 1s 几个 GB.
机械硬盘之所以读写速度慢, 是因为受限于其内部的 "机械" 结构.
其中, 盘片用来存储数据, 并在"真空"的环境下高速旋转(7200 / min, 相比计算机来说就很慢了), 磁头用来读写数据, 数据的读写操作需要磁头和盘片的配合机械运动来完成.

而固态硬盘(ssd), 其内部结构是一个更高规模的 "集成电路", 通过 "电子运动" 形式来完成数据的读写操作.
2. 文件路径
路径是 区分/识别 文件的一种方式, 通过路径, 可以识别定位到某一具体的文件.
计算机中, 目录中嵌套着多个不同的目录/文件, 形成了 N 叉树的树形结构.
简单来说, 路径就是从树根(盘符)开始, 到最终的文件, 中间需要经过哪些目录, 把这些目录记录下来, 这就是路径.

分割路径的字符(路径分隔符)有两种:
- / (斜杆) => 在主流的操作系统中, 都是使用 / (斜杆)来分割路径的.
- \ (反斜杠) => Windows 既可以使用 / (斜杆) 也可以使用 \ (反斜杠). Windows 默认为 \ (反斜杠)
但是, 在写代码时, 强烈建议使用 / (斜杆), 因为 \ (反斜杠) 会被当做转义字符使用.
如果想要表示 \ 就需要再次专义:

此外, 路径分为 绝对路径 和 相对路径.
2.1 绝对路径
从盘符(根节点)开始, 将文件所在位置逐级完整的表示出来, 就是绝对路径.

2.2 相对路径
相对路径, 就是相对于基准路径的路径, 也就是说, 想要表示一个相对路径, 必须明确一个 "基准路径".
此外, 还涉及以下两种操作符:
- . => 表示当前基准路径所在的目录位置(从当前位置往后续)
- .. => 代表当前基准路径的上一层路径
举个例子,
假设某文件的绝对路径为: C:\code1\test\demo.txt
- 若基准路径为: C:\code1\test => 则 ./demo.txt
- 若基准路径为: C:\code1 => 则 ./test/demo.txt
- 若基准路径为: C: => 则 ./code1/test/demo.txt
- 若基准路径为: C:\code1\test\XXX => 则 ../demo.txt
- 若基准路径为: C:\code1\test\XXX\YYY => 则 ../../demo.txt
如果我们在代码中写了一个相对路径, 那么基准路径是不确定的, 基准路径取决于程序运行的方式:
- 如果在 IDEA 中直接运行, 基准路径就是项目路径.



3. 文件分类
从开发角度, 文件分为两类:
- 文本文件
- 二进制文件
虽然文件分为两类, 但是所有的文件都是二进制的.(这是冯大佬祖师爷立下的规矩~~)
虽然文件都是二进制的, 但是有些文件比较特殊, 称为文本文件(特殊的二进制文件):
- 文件中的二进制数据恰好能构成字符(不仅仅是 ASCII), 即都能在码表上查到.
- 并且翻译过来的字符又能够构成有意义的信息.
满足以上两个条件的二进制文件, 我们称之为 文本文件.
那如何判断一个文件是文本文件还是二进制文件呢??
有一个简单的方法, 就是使用记事本打开(记事本是按照文本的方式打开的, 自动查码表, 进行翻译工作), 如果打开后内容是一堆乱码(看不懂), 就是二进制文件. 如果打开后的内容不是乱码(能看懂), 就是文本文件.

- 图片, 音频, 视频, 可执行程序 , word docx(富文本, 包含了多种信息)... 都是典型的二进制文件.
- txt纯文本, .java, .c ... 都是典型的文本文件.
综上, 关于文件, 有以下关键要点:
- 文件是存储在硬盘上的
- 目录(directory, 平时说的"文件夹"), 也是文件. 操作系统通过树形结构组织目录和文件.
- 通过路径, 可以识别定位到某一具体文件(路径分为绝对路径和相对路径)
- 文件分为二进制文件和文本文件
4. File 类
Java 标准库也提供了一些能够操作文件的类.
针对文件的操作, 分为以下两种:
- 文件系统操作. 如: 创建文件, 删除文件, 重命名, 创建目录.
- 文件内容操作. 如: 针对一个文件的内容进行读和写.
File 是 java.io 包下的类. File 就可以对文件进行系统操作.
4.1 属性
pathSeparator 是 File 类中的一个静态的成员变量, 表示路径分隔符.
- 在 Windows 上的 pathSeparator 就是 \
- 在其他系统上的 pathSeparator 就是 /
由于 Windows 也支持 / , 所以我们不必使用 pathSeparator , 直接使用 / 来分割路径就可以.
4.2 构造方法
| 构造方法 | 说明 |
| File(File parent, String child) | 根据父目录 + 孩子文件路径,创建⼀个新的 File 实例 |
| File(String pathname) | 根据文件路径创建⼀个新的 File 实例,路径可以是绝对路径或者相对路径 |
| File(String parent, String child) | 根据父目录 + 孩子文件路径,创建⼀个新的 File 实例,父目录用路径表示 |
其中, 第二个构造方法, File(String pathname), String参数表示的路径即可以是绝对路径, 也可以是相对路径.
注意: 使用 File 类构造方法传入的文件路径, 存不存在均可. File 都可以操作.
4.3 方法
| 修饰符及返回值类型 | 方法签名 | 说明 |
| 第一组 | ||
| String | getParent() | 返回File对象的父目录文件路径 |
| String | getName() | 返回FIle对象的纯文件名称 |
| String | getPath() | 返回File对象的文件路径 |
| String | getAbsolutePath() | 返回File对象的绝对路径 |
| String | getCanonicalPath() | 返回File对象的修饰过的绝对路径 |
|
注意: getPath 方法得到的路径和构造方法传入的路径有关:
getAbsolutePath 和 getCanonicalPath的区别:
| ||
| 第二组 | ||
| boolean | exists() | 判断File对象描述的文件是否真实存在 |
| boolean | isDirectory() | 判断File对象代表的文件是否是⼀个目录 |
| boolean | isFile() | 判断File对象代表的文件是否是⼀个普通文件 |
| boolean | createNewFile() | 根据File对象,自动创建⼀个空文件。成功创建后返回true |
| 当创建的 File 对象描述的文件不存在时:
使用 createNewFile 创建文件(通过 IDEA 创建的文件, 基准路径是项目路径):
其中, createNewFile 创建文件成功时, 返回 true, 创建失败时(文件已存在), 返回 false. 但是, 当出现以下情况时, createNewFile 会抛出异常:
| ||
| 第三组 | ||
| boolean | delete() | 根据File对象,删除该文件。成功删除后返回true |
| void | deleteOnExit() (不立即删除, 进程结束时才删除) | 根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行 |
| 其中, delete 是立即删除文件, 而 deleteOnExit 是等进程结束后再删除文件. deleteOnExit 有很多的使用场景:
| ||
| 第四组 | ||
| String[] | list() | 返回File对象代表的目录下的所有文件名 |
| File[] | listFiles() | 返回File对象代表的目录下的所有文件,以File对象表示 |
| list 和 listFiles 都可以获取当前目录下的子元素, 但不同的是:
| ||
| 第五组 | ||
| boolean | mkdir() | 创建File对象代表的目录 |
| boolean | mkdirs() | 创建File对象代表的目录,如果必要,会创建中间目录 |
| ||
| 第六组 | ||
| boolean | renameTo(File dest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操作 |
| renameTo 方法可以对文件进行重命名操作:
| ||
| 第七组 | ||
| boolean | canRead() | 判断用户是否对文件有可读权限 |
| boolean | canWrite() | 判断用户是否对文件有可写权限 |
END
相关文章:
文件操作和 IO(一):文件基础知识 文件系统操作 => File类
目录 1. 什么是文件 1.1 概念 1.2 硬盘, 内存, 寄存器之间的区别 1.3 机械硬盘和固态硬盘 2. 文件路径 2.1 绝对路径 2.2 相对路径 3. 文件分类 4. File 类 4.1 属性 4.2 构造方法 4.3 方法 1. 什么是文件 1.1 概念 狭义上的文件: 保存在硬盘上的文件广义的上的文…...
用Pyhon写一款简单的益智类小游戏——2048
文字版——代码及讲解 代码—— import random# 初始化游戏棋盘 def init_board():return [[0] * 4 for _ in range(4)]# 在棋盘上随机生成一个2或4 def add_new_tile(board):empty_cells [(i, j) for i in range(4) for j in range(4) if board[i][j] 0]if empty_cells:i,…...
akshare股票涨跌幅自定义范围查询:A股、港股、美股
参看:https://stock.hexun.com/2024-10-31/215251914.html 涨幅计算公式:(当前价格 - 上一个交易日收盘价) 上一个交易日收盘价 100% 。 跌幅计算公式:(上一个交易日收盘价 - 当前价格) 上一个…...
通过js控制修改css变量
在JavaScript中,你可以通过操作CSS变量(也称为自定义属性)来动态改变样式。CSS变量在CSS中使用 – 前缀定义,例如 --main-color: red;。在JavaScript中,你可以使用 document.documentElement.style.setProperty 方法来…...
<HarmonyOS第一课>HarmonyOS SDK开放能力简介的课后习题
不出户,知天下; 不窥牖,见天道。 其出弥远,其知弥少。 是以圣人不行而知,不见而明,不为而成。 本篇<HarmonyOS第一课>HarmonyOS SDK开放能力简介是简单介绍了HarmonyOS SDK,不需要大家过多…...
深度学习:yolo的使用--图像处理
定义了一个名为 ListDataset 的类,它继承自 PyTorch 的 Dataset 类,这个数据集从一个包含图像文件路径的列表中读取图像和对应的标签文件 class ListDataset(Dataset):def __init__(self, list_path, img_size416, augmentTrue, multiscaleTrue, normalized_labelsT…...
TypeScript实用笔记(一):初始化、类型定义与函数使用
文章目录 一、ts初始化1. 初始化.json文件一2. 启动方式2.1 直接运行.ts文件2.2 转换运行 二、类型1. 参数类型1.1 常规参数1.2 symbol1.3 数组\[]1.4 元组\[]1.5 用字面量定义数据类型 2. Object3. 枚举类型\[Enum]3.1 数字枚举3.2 字符串枚举 三、 类型别名1. 数组别名使用2.…...
【大数据学习 | kafka】producer之拦截器,序列化器与分区器
1. 自定义拦截器 interceptor是拦截器,可以拦截到发送到kafka中的数据进行二次处理,它是producer组成部分的第一个组件。 public static class MyInterceptor implements ProducerInterceptor<String,String>{Overridepublic ProducerRecord<…...
零基础学西班牙语,柯桥专业小语种培训泓畅学校
No te comas el coco, seguro que te ha salido bien la entrevista. Ya te llamarn. 别瞎想了!我保证你的面试很顺利。他们会给你打电话的。 这里的椰子是"头"的比喻。在西班牙的口语中,我们也可以听到其他同义表达,比如&#x…...
C++学习:类和对象(三)
一、深入讲解构造函数 1. 什么是构造函数? 构造函数(Constructor)是在创建对象时自动调用的特殊成员函数,用于初始化对象的成员变量。构造函数的名称与类名相同,没有返回类型 2. 构造函数的类型 (1&…...
高阶数据结构--图(graph)
图(graph) 1.并查集1. 并查集原理2. 并查集实现3. 并查集应用 2.图的基本概念3. 图的存储结构3.1 邻接矩阵3.2 邻接矩阵的代码实现3.3 邻接表3.4 邻接表的代码实现 4. 图的遍历4.1 图的广度优先遍历4.2 广度优先遍历的代码 1.并查集 1. 并查集原理 在一…...
xxl-job java.sql.SQLException: interrupt问题排查
近期生产环境固定凌晨报错,提示 ConnectionManager [Thread-23069] getWriteConnection db:***,pattern: error, jdbcUrl: jdbc:mysql://***:3306/***?connectTimeout3000&socketTimeout180000&autoReconnecttrue&zeroDateTimeBehaviorCONVERT_TO_NUL…...
jmeter压测工具环境搭建(Linux、Mac)
目录 java环境安装 1、anaconda安装java环境(推荐) 2、直接在本地环境安装java环境 yum方式安装jdk 二进制方式安装jdk jmeter环境安装 1、jmeter单机安装 启动jmeter 配置环境变量 jmeter配置中文 2、jmeter集群搭建 多台机器部署jmeter集群…...
docker设置加速
sudo tee /etc/docker/daemon.json <<-‘EOF’ { “registry-mirrors”: [ “https://register.liberx.info”, “https://dockerpull.com”, “https://docker.anyhub.us.kg”, “https://dockerhub.jobcher.com”, “https://dockerhub.icu”, “https://docker.awsl95…...
使用requestAnimationFrame写防抖和节流
debounce.ts 防抖工具函数: function Animate() {this.timer null; }Animate.prototype.start function (fn) {if (!fn) {throw new Error(需要执行函数);}if (this.timer) {this.stop();}this.timer requestAnimationFrame(fn); }Animate.prototype.stop function () {i…...
Puppeteer 与浏览器版本兼容性:自动化测试的最佳实践
Puppeteer 支持的浏览器版本映射:从 v20.0.0 到 v23.6.0 自 Puppeteer v20.0.0 起,这个强大的自动化库开始支持与 Chrome 浏览器的无头模式和有头模式共享相同代码路径,为自动化测试带来了更多便利。从 v23.0.0 开始,Puppeteer 进…...
Java方法重写
在Java中,方法重写是指在子类中重新定义父类中已经定义的方法。以下是Java方法重写的基本原则: 子类中的重写方法必须具有相同的方法签名(即相同的方法名、参数类型和返回类型)。子类中的重写方法不能比父类中的原方法具有更低的…...
vscode通过.vscode/launch.json 内置php服务启动thinkphp 应用后无法加载路由解决方法
我们在使用vscode的 .vscode/launch.json Launch built-in server and debug 启动thinkphp应用后默认是未加载thinkphp的路由文件的, 这个就导致了,某些thinkphp的一些url路由无法访问的情况, 如http://0.0.0.0:8000/api/auth.admin/info这…...
Webserver(2.6)有名管道
目录 有名管道有名管道使用有名管道的注意事项读写特性有名管道实现简单版聊天功能拓展:如何解决聊天过程的阻塞 有名管道 可以用在没有关系的进程之间,进行通信 有名管道使用 通过命令创建有名管道 mkfifo 名字 通过函数创建有名管道 int mkfifo …...
四足机器人实战篇之一:波士顿spot机器人工程实现分析
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、机器人发展历史二、硬件系统及电机执行器篇硬件系统电机执行器传感器机处理器电气连接三、感知(视觉点云、局部地图、定位)篇1.深度相机获取…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...








