IO、存储、硬盘:解析文件系统和File类

news2024/10/24 0:06:57

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

        在计算机科学中,IO(输入/输出)、存储、硬盘和文件系统是构成计算机数据处理和存储的基础。本文将探讨这些概念,特别是文件系统的工作原理和相关知识。 

输入/输出(IO):计算机的感官

        IO是计算机与外部世界交互的桥梁。它包括了所有形式的数据输入和输出操作。当我们在键盘上敲击文字、用鼠标点击链接、或者在屏幕上查看图片时,这些都是IO操作的实际应用。在计算机内部,IO操作也发生在硬件设备之间,比如CPU与内存之间的数据交换。

IO的类型

  1. 硬件IO:涉及计算机硬件设备,如键盘、鼠标、显示器、打印机等。
  2. 网络IO:涉及网络数据的传输,如通过互联网下载文件或发送电子邮件。
  3. 磁盘IO:涉及硬盘或其他存储设备的读写操作,是计算机存储数据的主要方式。

存储与硬盘:数据的物理载体

        存储设备是计算机系统中用于保存数据的硬件。它们可以是临时的,如RAM(随机存取存储器),也可以是永久的,如硬盘。硬盘作为最主要的永久存储设备,其容量和性能直接影响到计算机的整体表现。

 

硬盘的演变

  1. 传统硬盘(HDD):使用磁性碟片存储数据,体积较大,速度相对较慢。
  2. 固态硬盘(SSD):使用闪存技术,体积小巧,读写速度快,耐用性高,但成本相对较高。

随着技术的进步,SSD正逐渐取代HDD,成为主流的存储设备。

文件系统:组织和管理数据的框架

        文件系统是操作系统用于管理存储设备上文件和目录的一种机制。它定义了文件的存储方式、目录结构、以及如何访问和操作这些文件。

 

狭义上的文件

        针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成⼀个整体,而是独立成⼀个个的单位进行保存,这个独立的单位就被抽象成文件的概念.文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。
 

树型结构组织和目录

        同时,随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织——也就是数据结构中的树形结构。这样, 一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓的文件夹(folder)或者目录(directory)的概念。

文件路径(Path)

        如何在文件系统中如何定位一个唯一的文件就成为当前要解决的问题,从树型结构的角度来看,树中的每个节点都可以被一条从根开始,一直到达成的节点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。

        除了可以从根开始进行路径的描述,我们可以从任意节点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在节点的一条路径。 

文件系统的核心功能

  1. 数据存储:将数据以文件的形式保存在存储设备上。
  2. 目录结构:通过目录和子目录组织文件,形成树状结构,方便用户导航和查找。
  3. 文件访问:控制用户对文件的访问权限,确保数据安全。
  4. 数据恢复:在文件损坏或丢失时,提供恢复机制。

文件系统的多样性

不同的操作系统有不同的文件系统实现。例如:

  • Windows:使用NTFS或FAT32文件系统,文件名的后缀用于区分文件类型。
  • macOS:使用APFS或HFS+文件系统,不依赖文件名后缀来识别文件类型。
  • Linux:使用ext4、XFS等文件系统,同样不依赖文件名后缀。

这种多样性意味着跨平台操作时需要考虑文件系统的兼容性。

Java中的文件操作:实践文件系统知识

Java提供了丰富的API来操作文件和目录。通过java.io.File类,我们可以轻松地进行文件的创建、删除、重命名等操作。此外,Java的数据流类库,InputStreamOutputStream,允许我们以字节为单位进行文件的读写操作。

我们先来看看 File 类中的常见属性、构造方法和方法:

属性:

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String类型的表示
static charpathSeparator依赖于系统的路径分隔符,char类型的表示

构造方法: 

签名说明
File(File parent, String child)根据父目录 + 孩子文件路径,创建一个新的File实例
File(String pathname)根据文件路径创建一个新File实例,路径可以是绝对路径或者相对路径
File(String parent, String child)根据父目录 + 孩子文件路径,创建一个新File实例,父目录用路径表示

方法: 

修饰符及返回值类型 方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象的修饰过的绝对路径
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是一个目录
booleanisFile()判断File对象代表的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自动创建一个空文件,成功创建后返回true
booleandelete()根据File对象,删除该文件。成功删除后返回true
voiddeleteOnExit()根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行
String[ ]list()返回File对象代表的目录下的所有文件名
File[ ]listFiles()返回File对象代表的目录下的所有文件,以File对象表示
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

代码示例 

 示例1:get系列的特点和差异

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("..\\hello-world.txt"); // 并不要求该文件真实存在
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
    }
}

 运行结果

..
hello-world.txt
..\hello-world.txt
D:\代码练习\文件示例1\..\hello-world.txt
D:\代码练习\hello-world.txt

这些输出分别对应于:

  1. file.getParent():返回的是文件的父目录,由于文件路径是相对的,并且指向上一级目录,所以这里只返回了两个点(..)表示上一级目录。

  2. file.getName():返回的是文件的名称,这里是hello-world.txt

  3. file.getPath():返回的是文件的路径,这通常与构造函数中提供的路径相同,这里是..\hello-world.txt

  4. file.getAbsolutePath():返回的是文件的绝对路径,这是根据当前工作目录解析相对路径后得到的,这里是D:\代码练习\文件示例1\..\hello-world.txt

  5. file.getCanonicalPath():返回的是文件的规范化绝对路径,这意味着路径中的...已经被解析,这里是D:\代码练习\hello-world.txt。这个路径表示文件实际上位于D:\代码练习目录下。

示例2:普通文件的创建

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("hello-world.txt"); // 要求该文件不存在,才能看到效果
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.createNewFile());
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.createNewFile());
    }
}

运行结果

false
false
false
true
true
false
true
false

这些输出分别对应于:

  1. file.exists():在文件不存在时,返回false
  2. file.isDirectory():在文件不存在时,返回false,因为无法判断它是否是一个目录。
  3. file.isFile():在文件不存在时,返回false,因为无法判断它是否是一个文件。
  4. file.createNewFile():尝试创建文件,如果成功则返回true
  5. file.exists():在文件被成功创建后,返回true
  6. file.isDirectory():检查新创建的文件是否是目录,返回false,因为它是一个文件。
  7. file.isFile():检查新创建的文件是否是文件,返回true
  8. file.createNewFile():再次尝试创建已存在的文件,返回false,因为文件系统不允许创建已存在的文件。

 示例3:普通文件的删除

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("some-file.txt"); // 要求该文件不存在,才能看到相应效果
        System.out.println(file.exists());
        System.out.println(file.createNewFile());
        System.out.println(file.exists());
        System.out.println(file.delete());
        System.out.println(file.exists());
    }
}

 运行结果

false
true
true
true
false

这些输出分别对应于:

  1. file.exists():在文件不存在时,返回false
  2. file.createNewFile():尝试创建文件,如果文件成功被创建,返回true
  3. file.exists():在文件被创建之后,再次检查文件是否存在,返回true
  4. file.delete():尝试删除已存在的文件,如果文件成功被删除,返回true
  5. file.exists():在文件被删除之后,再次检查文件是否存在,返回false,因为文件已经被删除。

 示例4:观察 deleteOnExit 的现象

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("some-file.txt"); // 要求该文件不存在,才能看到相应效果
        System.out.println(file.exists());
        System.out.println(file.createNewFile());
        System.out.println(file.exists());
        file.deleteOnExit();
        System.out.println(file.exists());
    }
}

 运行结果

false
true
true
true

这些输出分别对应于:

  1. file.exists():在文件不存在时,返回false
  2. file.createNewFile():尝试创建文件,如果文件成功被创建,返回true
  3. file.exists():在文件被创建之后,返回true,因为文件现在已经存在。
  4. file.deleteOnExit():这个方法会请求在虚拟机终止时删除文件。调用这个方法后,file.exists()的返回值仍然是true,因为文件还没有被删除,deleteOnExit只是标记了这个文件在JVM退出时应该被删除。

        请注意,deleteOnExit()方法的效果不会立即显现,它只有在JVM终止时才会执行删除操作。这意味着,即使你调用了deleteOnExit()方法,文件在程序运行期间仍然存在,直到JVM退出。如果你想验证deleteOnExit()的效果,你需要在程序运行结束后检查文件是否被删除。

示例5:观察目录的创建

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        File dir = new File("some-dir"); // 要求该目录不存在,才能看到相同的现象
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
        System.out.println(dir.mkdir());
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
    }
}

 运行结果

false
false
true
true
false

这些输出分别对应于:

  1. dir.isDirectory():在目录不存在时,返回false
  2. dir.isFile():在目录不存在时,同样返回false,因为该路径既不表示一个已存在的目录也不表示一个文件。
  3. dir.mkdir():尝试创建目录,如果目录成功被创建,返回true
  4. dir.isDirectory():在目录被创建之后,返回true,表明该路径现在指向一个存在的目录。
  5. dir.isFile():在目录存在的情况下,返回false,因为该路径现在指向一个目录而不是一个文件。

         理解了以上文件系统的基本操作,下一篇博客我将介绍IO流 InputStream, OutputStream 的用法,跳转链接:【Java】IO流:InputStream与OutputStream实战指南-CSDN博客


希望这篇博客能为你理解IO操作以及文件系统提供一些帮助

如有不足之处请多多指出

我是高耳机

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

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

相关文章

【C++篇】探索STL之美:熟悉使用String类

CSDN 文章目录 前言 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&…

吴恩达深度学习笔记(8)

计算机视觉 包括:图像分类也叫做图像识别、目标检测等 一个小的图像可能1M,但是他的像素是一个超级大向量,如果直接深度学习那么运算量会很大,因此需要运用卷积运算。 卷积运算是卷积神经网络的基础单元之一。下面用边缘检测理…

【Qt】控件——Qt多元素控件、常见的多元素控件、多元素控件的使用、List Widget、Table Widget、Tree Widget

文章目录 QtQt多元素控件List WidgetTable WidgetTree Widget Qt Qt多元素控件 List Widget 使用 QListWidget 能够显示一个纵向的列表。 属性说明currentRow当前被选中的是第几行。count一共有多少行。sortingEnabled是否允许排序。isWrapping是否允许换行。itemAlignment元素…

软件架构的 “4+1” 视图(附视图案例)

简介 Philippe Kruchten 在《IEEE Software》上发表的《The 41 View Model of Architecture》论文中提出了“41”视图方法,该方法被RUP采纳。“41”视图模型通过逻辑视图、进程视图(也称为处理视图)、物理视图、开发视图 和 场景视图 五个视…

YOLOv9改进,YOLOv9引入FLAttention注意力机制(ICCV2023),并二次创新RepNCSPELAN4结构

摘要 自我注意的二次计算复杂度在将 Transformer 模型应用于视觉任务时,这是一个长期存在的问题。除了减少注意力区域外,线性注意力也被认为是避免过多计算成本的有效解决方案。通过使用精心设计的映射函数来逼近 Softmax,线性注意力可以在自注意力操作中切换计算顺序并实现…

HTTP Proxy环境下部署Microsoft Entra Connect和Health Agents

在企业环境中,时常需要通过使用HTTP Proxy访问Internet,在使用HTTP Proxy访问Internet的环境中部署Microsoft Entra Connect和Microsoft Entra Connect Health Agents可能会遇到一些额外的配置步骤,以便这些服务能够正常连接到Internet。 一…

再Android10上实现检测AHD摄像头是否接入

项目有个需要,需要知道tp9951是否接入AHD摄像头 1,驱动层可以通过读取寄存器的值来检测是否接入AHD摄像头 tp9951_write_reg(0x40, 0x00); //select decoder page tp9951_write_reg(0x41, ch); val tp9951_read_reg(TP_INPUT_STATUS_REG);…

vscode默认添加python项目的源目录路径到执行环境(解决ModuleNotFoundError: No module named问题)

0. 问题描述 vscode中编写python脚本,导入工程目录下的其他模块,出现ModuleNotFoundError: No module named 错误 在test2的ccc.py文件中执行print(sys.path) 查看路径 返回结果发现并无’/home/xxx/first_demo’的路径,所以test2下面的文…

Vscode + EIDE +CortexDebug 调试Stm32(记录)

{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{"cwd": "${workspaceRoot…

w~自动驾驶合集9

我自己的原文哦~ https://blog.51cto.com/whaosoft/12320882 #自动驾驶数据集全面调研 自动驾驶技术在硬件和深度学习方法的最新进展中迅速发展,并展现出令人期待的性能。高质量的数据集对于开发可靠的自动驾驶算法至关重要。先前的数据集调研试图回顾这些数据集&…

Djang学习- URL反转

代码中url书写规范&#xff1a; 、 url反向解析 urls: path(test/url, views.test_url),path(test_result/<int:age>, views.test_result, name"rl") views: def test_url(request):return render(request, test_url.html)def test_result(request,age):re…

Vue3学习:vite项目中图片不能显示,报错 require is not defined

今天做了一个案例“给你喜欢的人送花”&#xff0c;如果喜欢谁&#xff0c;就给谁送花&#xff0c;最多可以送5朵。运行效果如下。 这个项目是使用 npm create vitelatest 命令创建的。 包括2个组件&#xff1a; 根组件App.vue子组件HelloVote.vue。 目录结构如图所示&#x…

资讯 | 财富通科技政务协同办公管理软件通过麒麟软件适配认证

2024年9月25日&#xff0c;财富通科技研发的政务协同办公管理软件成功通过中国国产操作系统麒麟软件的适配认证。本次认证是继公司区块链产品“基于区块链的企业及人员资质数字证书服务平台”认证以后得第二次认证。这一成就标志着财富通科技在推动国产软件生态建设方面迈出了坚…

基于SSM+微信小程序的家庭记账本管理系统(家庭1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员端功能有首页、个人中心、用户管理&#xff0c;消费详情管理、收入详情管理、系统管理等。 2、用户端功能有首页、消费详情、收入详情、论坛信息、我的等功能。 2、项目技术 …

数据结构作业day2

作业一&#xff1a;结构体数组存储学生信息&#xff08;姓名&#xff0c;年龄&#xff0c;分数&#xff09;&#xff0c;完成输入学生信息&#xff0c;输出学生信息&#xff0c;求学生成绩之和&#xff0c;求最低学生成绩。 main.c #include "test.h"int main(int …

GitLab 老旧版本如何升级?

极狐GitLab 正式对外推出 GitLab 专业升级服务 https://dl.gitlab.cn/cm33bsfv&#xff01; 专业的技术人员为您的 GitLab 老旧版本实例进行专业升级&#xff01;服务详情可以在官网查看详细解读&#xff01; 那些因为老旧版本而被攻击的例子 话不多说&#xff0c;直接上图&a…

视频转GIF,5个简单好用的转换工具任你选!

GIF&#xff08;Graphics Interchange Format&#xff09;&#xff0c;作为一种轻量级的图像文件格式&#xff0c;因其能够存储多帧图像形成简单动画而广受欢迎。无论是动画影视片段&#xff0c;还是日常生活的小确幸&#xff0c;GIF都能将其定格为生动的视觉语言。当我们想要将…

FileLink跨网文件摆渡系统:重构跨网文件传输新时代

在数字化浪潮的推动下&#xff0c;企业对于数据的高效利用和安全管理提出了前所未有的要求。面对不同网络环境间的文件传输难题&#xff0c;传统方法往往显得力不从心&#xff0c;不仅效率低下&#xff0c;还存在极大的安全隐患。而FileLink跨网文件摆渡系统的出现&#xff0c;…

深信服超融合HCI6.8.0R2滚动热升级至HCI6.9.1

PS&#xff1a;滚动热升级没有业务影响&#xff0c;集群内主机逐台升级&#xff0c;会自动迁移运行中的虚拟机至其他主机&#xff1b; 整体巡检加上升级完成大概要三个小时的时间。如果在升级过程中&#xff0c;有跨集群迁移的任务&#xff0c;需要先停掉&#xff0c;不然无法…

excel将文本型数字转变为数值型数字

问题导入&#xff1a;复制数字到excel表格中&#xff0c;但是表格中数字显示为文本&#xff0c;且无法通过常规方法转变为可进行四则运算的数字。例如&#xff1a;在i3单元格中输入常规的转换方法仍然报错。在j3单元格中输入ISTEXT(H3)显示h3单元格确实为文本。 解决办法&#…