文件操作和 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 概念

  1. 狭义上的文件: 保存在硬盘上的文件
  2. 广义的上的文件: 操作系统进行资源管理的一种机制. (很多软件/硬件资源, 抽象成文件来表示)

我们主要针对的是狭义上的文件.

注意:

文件夹也是 文件!!

其实 "文件夹" 是我们口中通俗的一个说法, 用专业术语来讲 "文件夹" 其实是 目录(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 叉树的树形结构.

简单来说, 路径就是从树根(盘符)开始, 到最终的文件, 中间需要经过哪些目录, 把这些目录记录下来, 这就是路径.

 分割路径的字符(路径分隔符)有两种:

  1. / (斜杆)  => 在主流的操作系统中, 都是使用 / (斜杆)来分割路径的.
  2. \ (反斜杠) => 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

如果我们在代码中写了一个相对路径, 那么基准路径是不确定的, 基准路径取决于程序运行的方式:

  1.  如果在 IDEA 中直接运行, 基准路径就是项目路径.

 3. 文件分类

从开发角度, 文件分为两类:

  1. 文本文件
  2. 二进制文件

虽然文件分为两类, 但是所有的文件都是二进制的.(这是冯大佬祖师爷立下的规矩~~)

虽然文件都是二进制的, 但是有些文件比较特殊, 称为文本文件(特殊的二进制文件):

  1. 文件中的二进制数据恰好能构成字符(不仅仅是 ASCII), 即都能在码表上查到.
  2. 并且翻译过来的字符又能够构成有意义的信息.

满足以上两个条件的二进制文件, 我们称之为 文本文件.

那如何判断一个文件是文本文件还是二进制文件呢??

有一个简单的方法, 就是使用记事本打开(记事本是按照文本的方式打开的, 自动查码表, 进行翻译工作), 如果打开后内容是一堆乱码(看不懂), 就是二进制文件. 如果打开后的内容不是乱码(能看懂), 就是文本文件.

  • 图片, 音频, 视频, 可执行程序 , word docx(富文本, 包含了多种信息)... 都是典型的二进制文件.
  • txt纯文本, .java, .c ... 都是典型的文本文件. 

综上, 关于文件, 有以下关键要点:

  1. 文件是存储在硬盘上的
  2. 目录(directory, 平时说的"文件夹"), 也是文件. 操作系统通过树形结构组织目录和文件.
  3. 通过路径, 可以识别定位到某一具体文件(路径分为绝对路径和相对路径)
  4.  文件分为二进制文件和文本文件

4. File 类

Java 标准库也提供了一些能够操作文件的类.

针对文件的操作, 分为以下两种:

  1. 文件系统操作. 如: 创建文件, 删除文件, 重命名, 创建目录.
  2. 文件内容操作. 如: 针对一个文件的内容进行读和写.

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 方法

修饰符及返回值类型方法签名说明
                                                                        第一组
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回FIle对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象的修饰过的绝对路径

注意:

getPath 方法得到的路径和构造方法传入的路径有关:

  • 若传入的是决定路径, 返回的就是决定路径
  • 若传入的是相对路径, 返回的就是相对路径

getAbsolutePath 和 getCanonicalPath的区别:

  • getAbsolutePath 返回的是绝对路径的复杂版本, 带有 . 或者 ..
  • getCanonicalPath  返回的是绝对路径的简化版本, 把 . 或者 .. 干掉(可能会抛IOException 异常)
                                                                        第二组
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是⼀个目录
booleanisFile()判断File对象代表的文件是否是⼀个普通文件
booleancreateNewFile()根据File对象,自动创建⼀个空文件。成功创建后返回true

当创建的 File 对象描述的文件不存在时: 

使用 createNewFile 创建文件(通过 IDEA 创建的文件, 基准路径是项目路径):

其中, createNewFile 创建文件成功时, 返回 true, 创建失败时(文件已存在), 返回 false.

但是, 当出现以下情况时, createNewFile 会抛出异常:

  1. 硬盘已满
  2. 没有创建文件的权限
  3. 硬盘损坏

                                                                        第三组
booleandelete()根据File对象,删除该文件。成功删除后返回true
void

deleteOnExit()

(不立即删除,

进程结束时才删除)

根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行

其中, delete 是立即删除文件, 而 deleteOnExit 是等进程结束后再删除文件.

deleteOnExit 有很多的使用场景:

  • 比如使用 office 写文档时, 都会产生一个临时文档(保存我们正在编辑的内存), 当 office 正常关闭时, 这这个临时文件就会被删除; 而当 office 被异常关闭(如断电), 这个临时文件就不会被删除, 当我们下次启动 office 时, 就会可以从这个临时文件中, 恢复上次编辑的内容.
                                                                        第四组
String[]list()返回File对象代表的目录下的所有文件名
File[]listFiles()返回File对象代表的目录下的所有文件,以File对象表示

list 和 listFiles 都可以获取当前目录下的子元素, 但不同的是:

  1. list 返回的是子元素的名称(字符串类型)
  2. 而 listFiles 返回的是子元素的 File 对象(这些对象可以使用 File 的方法)

                                                                        第五组
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间目录
  • 其中, mkdir 只能创建一个目录: 

  • 而 mkdirs 可以创建多级目录:

                                                                        第六组
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作

renameTo 方法可以对文件进行重命名操作:

  • 同时, renameTo 也可以对文件进行移动操作(从操作系统的角度看, 重命名和移动操作的本质是一样的, 而且移动的速度极快, O(1)
  • 剪切(俗称) == 移动(计算机术语)
  • 但是如果移动操作跨硬盘(不是C/D盘)了, 就相当于 复制+删除 , 速度就慢了
  • 复制文件, O(N), 遍历原文件所有内容, 再写入新的文件

                                                                        第七组
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter Color 大调整,需适配迁移,颜色不再是 0-255,而是 0-1.0,支持更大色域

在之前的 3.10 里, Flutter 的 Impeller 在 iOS 上支持了 P3 广色域图像渲染,但是当时也仅仅是当具有广色域图像或渐变时,Impeller 才会在 iOS 上显示 P3 的广色域的颜色,而如果你使用的是 Color API,会发现使用的还是…

web自动化测试平台开发之核心执行器

web自动化测试平台开发之核心执行器 一、如何从自动化框架到核心执行器二、核心执行器框架逻辑梳理三、核心执行器利用命令驱动执行 一、如何从自动化框架到核心执行器 脚本:底层用了三个内容:pythonpytestselenium,线性脚本,只是单纯的把功能测试用例转…

Rust 力扣 - 2090. 半径为 k 的子数组平均值

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 半径为 k 的子数组平均值 等价于 子数组长度为2 * k 1的总和 除于 2 * k 1 我们遍历长度为2 * k 1的窗口,我们只需要记录窗口内的平均值即可 题解代码 impl Solution {pub fn get_averages(num…

直接内存、死锁、方法句柄

直接内存 1. 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域 2. 直接内存是在Java堆外、直接向系统申请的内存区间 3. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 4. 通常,访问直接内存的速度会优于Java堆&am…

C++《list》

在本篇当中我们将学习STL中的list,在此list就是我们之前在数据结构学习过的链表,在本篇中我们要来了解list当中的成员函数该如何使用,由于list各个函数的接口和之前学习过的vector类型,因此在学习list的使用就较为轻松。在lis篇章…

【牛客刷题实战】二叉树遍历

大家好,我是小卡皮巴拉 文章目录 目录 牛客题目: 二叉树遍历 题目描述 输入描述: 输出描述: 示例1 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码(C语言) 兄弟们共勉 !&…

vmvare启动freebsd操作系统密码忘记了怎么办?

本章教程,主要介绍,通过vmvare安装的freebsd操作系统,密码忘记了,如何重置密码。 一、重启虚拟机 在重启过程中,按键盘中是数字2,进入单用户模式。 二、进入到shell界面 在出现“Enter full pathname of shell or RETURN for /bin/sh:”直接按回车键。 三、输入命令 mou…

【设计模式系列】代理模式(八)

一、什么是代理模式 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对…

WPS查询函数VLOOKUP,匹配寻找值自动带入值

想实现在下表输入物料名称后,把上表中的单位自动带入 那就要用到VLOOKUP函数,获取第2个表第1列的值后去第1个表的第1列匹配,匹配到后得到行数值,把第1个表的第2列赋值给第2个表的第2列。 Vlookup函数参数为Vlookup(查找值&#…

sqoop问题汇总记录

此篇博客仅记录在使用sqoop时遇到的各种问题。持续更新,有问题评论区一起探讨,写得有不足之处见谅。 Oracle_to_hive 1. main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTr…

简单说明vuex

vuex 知识结构配置调用 知识结构 vue用于管理公共数据的仓库 配置 state:所有公共数据的初始状态(初始值) export default {state: {count: 0,} };mutations:修改state内容的方法(必须为同步方法) export …

分类算法——决策树 详解

决策树的底层原理 决策树是一种常用的分类和回归算法,其基本原理是通过一系列的简单决策,将数据集划分为多个子集,从而实现分类。决策树的核心思想是通过树形结构表示决策过程,节点代表特征,边代表决策,叶子…

Nature Electronics 用于语音识别的液体声传感器,基于悬浮在载液的钕-铁-硼磁性纳米颗粒

近年来,工程师们开发了一系列越来越复杂的传感器,用于机器人、便携式、可穿戴甚至植入式监测。然后,可以使用最先进的机器学习来分析这些传感器收集的数据,使设备能够识别音频中的特定声音、图像中的对象或其他信息。加州大学洛杉…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上

在当今智能化、数字化的时代,视频监控已经成为各行各业不可或缺的一部分,无论是公共安全、交通管理、企业监控还是智慧城市建设,都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中,将监控视频实时投放到大屏幕电视墙上…

【GeoJSON在线编辑平台】(0)项目启动与前言

前言 事情是这样的…… 有这么一个项目,需要开发一个在线的标注平台。以天地图为底图,在天地图上标注出一些特征地物,比如描出农田耕地房屋建筑之类的要素。 这个需求简化一下其实就是一个在线的矢量编辑平台,通过绘制多边形功能…

豆包,攻克数字是个什么工具?《GKData-挖掘数据的无限可能》(数据爬虫采集工具)

豆包,攻克数字是个什么工具? “攻克数字” 指的是 “攻克数字(GKData)” 这样一款工具。是一款针对网页、APP中数据自动解析转表存入数据库的软件,为数据工作者而生。它是一个不会编程也能用的可视化数据解析为标准二…

【成都新篇】龙信科技电子取证实验室,引领科技取证新时代

文章关键词:电子数据取证实验室、手机取证、介质取证、云取证、现场勘查、电子物证 在科技创新的浪潮中,龙信科技成都实验室以其卓越的电子数据取证服务,成为了中西部地区一颗璀璨的明珠。随着新址的搬迁,我们不仅扩大了业务范围…

【C/C++】字符/字符串函数(1)——由string.h提供

零.导言 什么是字符/字符串函数呢? 其实就是一类用于处理字符和字符串的函数。 而其中一部分函数包含在头文件 string.h 中,有 strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok strerror 等等 接下来我将逐个讲解这些函数。 一.str…

硅谷甄选(11)角色管理

角色管理模块 10.1 角色管理模块静态搭建 还是熟悉的组件&#xff1a;el-card、el-table 、el-pagination、el-form <template><el-card><el-form :inline"true" class"form"><el-form-item label"职位搜索"><el-…

鸿蒙UI开发——基于全屏方案实现沉浸式界面

1、概 述 典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条。 其中状态栏和导航条&#xff0c;通常在沉浸式布局下称为避让区&#xff0c;避让区之外的区域称为安全区。 开发应用沉浸式效果主要指&#xff1a;通过调整状态栏、应用界面和导航条的显示效果来减少状态…