目录
硬件我们可以粗略地分为四大类:
处理器(CPU),存储器(内存),输入设备(Input Device), 输出设备(Output Device)
其中,CPU只能和内存做直接的数据交换
输入设备和输出设备我们统称为I/O
输入设备:将现实中的物理信号(光信号,电信号,波信号) ->数字个数,存储在内存中
输出设备:数字->物理信号
输入输出设备有:鼠标,屏幕,扬声器,摄像头,麦克风,键盘,网卡,硬盘等等。
本篇重点说明硬盘这个I/O设备
我们可以把计算机的存储结构比作一个金字塔,塔尖的传播速度最快,但是容量较小,
反之则越来越慢,但是塔底的容量最大。
具体的存储结构可以分为这么几部分:
易失存储指:在此级别下存储的数据:
1.断电后丢失
2.以进程为单位管理
CPU内部:寄存器,3级缓存(高速缓存器)
在此级别,数据的存储结构是最快的
内存
又被称为RAM,支持以O(1)时间复杂度,根据下标(内存地址)访问的数据
值得注意的是,变量,对象本质上就是编程语言对硬件中内存的抽象
速度不如寄存器和缓存器,但是依旧较快
持久存储指:在此级别下存储的数据
1.断电后仍可以保存
2.通常可以跨进程读写
硬盘
硬盘的速度在内存之下,也属于较为快速的存储类型,容量较大
脱机存储,网络存储
此级别下的存储速度是最慢的,但容量也是最大的
脱机存储指:U盘,移动硬盘,磁带,光盘等存储方式
网络存储指:百度网盘,云盘这一系列的
可以用一张图表示计算机的存储结构
作为开发工程师,可以把重点放在软件层面上。
我们可以简单认为硬盘有数据存储的就是一个整体的存储结构,而没有数据存储的是可用空间。
在计算机中,文件是由OS和文件系统(File System)统一管理的
下面说一说关于文件的基本知识
这里的树不是二叉树,文件都是树上的结点
每个节点都可以有多个孩子,也就是说每个文件夹中可以有多个类型的文件
普通文件其实也就是存储数据的文件
像一些文本文件
像.txt文件,.java文件等
也有不是文本的文件(二进制文件)
.class文件,.png文件等
这种文件用来管理树形结构组织数据,以/结尾就代表这个节点是目录
文件树是逻辑结构,不代表硬盘的物理结构,也就是说同一目录下的文件在硬盘中也不一定挨着
路径只是一种描述,不代表这个路径一定是真实存在的。
从树的根节点出发描述的路径
从“我们"的位置出发,描述的路径
“我们”指的就是进程的当前工作目录,一般一个进程的启动目录就是当前的工作目录。
首先,在绝对路径下,一定是以某个盘为根节点开头的,比如D: \ 课程 \ 火箭班 \ 板书.png
相对路径不是由根开始的
当我们处在课程处时,火箭班\板书.png就是相对路径。
我们用一个String类型描述路径
这个符号 “ \ ” 叫做路径分隔符,在Java中我们想用的话需要再多打一个\ ,因为一个\表示转义
或者 我们可以用 “ / ” 来替代,就不需要分隔符了。
一个 “ . ” 表示在当前位置(目录)不同
“ .. ”表示回到当前位置的父节点上
这两个符号多用于相对路径
普通文件一定是叶子节点
目录文件均可,作为空目录时也可以作为叶子节点
这代表着当我移动或更改一个目录时,其实是对其中的每一个节点进行操作的。(如果目录中还有目录就进行深度遍历或广度遍历)。
文件数据包括元数据和内容数据,接下来我们只关注元文件本身。
对于文件树的操作,可以分为,判断是否是目录,创建,删除,重命名。
首先 使用File file = new File(“路径字符串”);来描述一个路径。
creatNewFile();
若创建的文件已存在,则创建失败,返回false
抛出异常很有可能是路径问题
delete();
只能删除空目录或者普通文件,如果想删除非空目录的话需要进行深度或广度遍历删掉所有子节点才可以删除当前目录。
file.delete();
- public class Demo2 {
- public static void main(String[] args) throws Exception {
- File file = new File("D:\\课程\\2022-06-27-2022火箭班-IO\\some-dir");
- traversal(file);
- file.delete();
- // boolean r = file.delete();
- // System.out.println(r);
- }
-
- private static void traversal(File dir) throws Exception {
- File[] files = dir.listFiles(); // 查看这个目录下的所有孩子(不是子孙)
- for (File file : files) {
- if (file.isDirectory()) { // 如果这个孩子也是目录,继续深度优先进行遍历
- System.out.println(file.getCanonicalPath() + "\\");
- traversal(file);
- // 当深度优先的遍历完成时,则可以认为该目录一定是空目录了
- file.delete();
- } else {
- System.out.println(file.getCanonicalPath()); // 得到这个文件的一个标准(去除一切无意义的 . 和 ..)
- file.delete();
- }
- }
- }
- }