“文件”是一个广义的概念。①硬盘上的普通文件 ②硬盘上的目录(文件夹)
很多的硬件设备,也是被操作系统抽象成文件,如:键盘,显示器,网卡。
fprintf fscanf -> 针对文件来输入输出。
fprintf(STDOUT,"hello")=> 这个代码也可以在屏幕上显示,效果等同于printf
机械硬盘
对于机械硬盘来说,更擅长顺序读写,不擅长随机读写。
顺序读写:有一个很大的文件,要把文件整体复制一下 =>一般不太需要移动磁头,速度快
随机读写:某个目录中,有很多小文件(每个文件都很小,文件数目特别多)要把整个目录都拷贝一下。=> 磁头需要不停的移动,去找位置,再小也有质量(物理学)受限于牛顿第二定律,克服惯性做功,就需消耗更多的时间。=> 软件的特性受限于硬件设备,硬件设备的特征受限于物理学原理。
这些小文件在硬盘上存储不是连续的,而是离散的,可能出现在硬盘的各个位置上。
磁头 =>很细的针头能够感知到磁性的变化。悬停在盘片的不同位置,就能感知到磁性数据信息。
everything
Windows的文件搜索工具。使用windows自带的文件搜索功能速度非常慢。
核心思想:“空间换时间”
everything中内置了一个小的数据库,就会在最初安装好的时候,把你的整个文件系统都进行一个遍历,把这里的信息都拿到,存储到内置的数据库中,后续再搜索时,不是去遍历,而是直接去内置的数据库里查询。
everything还能感知硬盘上的变化,如创建文件/删除文件/重命名,都能感知到并更新自己的数据库。
everything扫描系统时,并非单纯的目录级别的遍历,也会用到NTFS(Windows自带的文件系统)文件系统中内置的索引信息。
文件系统
操作系统有一个专门的模块 => 文件系统(把硬件细节封装好,提高统一的api来供调用)
此处文件系统时按照“树形结构”来组织文件的。每一个普通文件(非目录)就是叶子节点,一个目录文件里面有很多的子节点。
操作系统,使用“路径”这样的概念来描述一个具体文件的位置。 例如:C:\User\...\test.txt
从根节点出发(Windows上是从盘符出发)一级一级往下走,走到目标文件,把中间经过的所有目录的名字都穿起来,使用/或\分割,构成了“路径”。
先有文件,然后根据这个文件所处的位置,找到它的路径,记录这个路径之后,下次再找就能沿着路径快速找到这个文件。
路径有两种不同的风格:
1、绝对路径:从根节点出发,(Windows为盘符)一层一层最终到达目标文件。
2、相对路径:先指定一个“当前目录”/“工作目录”/“基准目录”出发,找到目标文件。
二进制文件的内容都是合法的字符,存储任何数据都可以。
字符编码: 普通英文字母:ASCII,汉字gbk/utf8
无论哪种方式,都有一个“码表”,文件中存储的数据都是在指定码表上有据可查=> 合法的字符。此时这个文件就是文本文件。
文本文件和二进制文件代码操作的方式是有差别的。使用记事本来判定。
使用记事本打开,不是乱码。 => 文本文件:文本文档 .c .java .cpp
使用记事本打开,是乱码。=> 二进制文件:图片,音频,视频,可执行程序,动态库,.class
word .docx / excel .xlsx / power point .pptx(富文本,比普通文本内容丰富)
Java对文件操作的API
1、针对文件系统的操作(右键某个目录的时候,能够进行的一些操作)
创建、删除、重命名文件,列出文件内容...
2、针对文件内容的操作:读文件/写文件
Java中针对文件系统的操作,使用File类来进行,该类所在包为java.io =>input和output
属性
pathSeparator static String
pathSeparator static char
路径之间的分隔符,根据系统自动调整的,实际开发中建议使用/
构造方法
File(File parent,String child) => 根据父目录+孩子文件路径
File(String pathanme) => 构造一个File对象,要指定路径,绝对路径/相对路径。
1)如果是直接在idea上运行程序,此时的工作目录就是项目所在目录。
2)如果是把代码打包成一个单独的jar包,此时的工作目录就是jar包所在的目录。
File(String parent,String child)
其他方法
getParent() String 返回File对象的父目录文件路径
getName() String 返回File对象的纯文件名称
getPath() String 返回File对象的文件路径
getAbsolutePath() String 返回File对象的绝对路径
getCanonicalPath() String 返回File对象的修饰过的绝对路径
exists() boolean 判断File对象描述的文件是否真实存在
isDirectory() boolean 判断File对象代表的文件是否是一个目录
isFile() boolean 判断File对象代表的文件是否是一个普通文件
createNewFile() boolean 根据File对象,自动创建一个空文件,成功创建后返回true
delete() boolean 根据File对象,删除该文件,成功删除后返回true
deleteOnExit() void 根据File对象,标注文件将被删除,删除动作会到jvm运行结束才会进行
list() String[] 返回File对象代表的目录下的所有文件名
listFiles() File[] 返回File对象代表的目录下的所有文件,以File对象表示
mkdir() boolean 创建File对象代表的目录
mkdirs() boolean 创建File对象代表的目录,如果必要会创建中间目录
renameTo(File dest) boolean 进行文件改名,也可视为平时的剪切,粘贴操作
canRead() boolean 判断用户是否对文件有可读操作
canWrite() boolean 判断用户是否对文件有可写操作