1.1 题目:
DOS 的文件分配表策略的模拟实现
1.2 问题的描述:
( 1 )磁盘总空间 300 个簇,开始时全为空闲状态;
( 2 )以文件为单位申请和释放簇(意味着创建,删除和修改),文件大小随机生成,最少 100 个文件申请;
( 3 )设置一个文件目录项表,记录文件名,起始簇号和簇数;
( 4 )万一磁盘空间不够,就报告,并把新的文件请求保存,直到有文件被释放;
( 5 )所有请求完后,列出已保存如磁盘的文件信息;
2.1 问题分析:
(1 )这个课程设计是一个DOS 的文件分配策略表的模拟实现,在磁盘里,是以簇为最小的逻辑存储空间,所以可以用一个300 个空间的数组FAT[30][10] 来表示这个磁盘的空间。
(2 )由于要记录文件的相关信息,所以用到一个文件的类,用该类的属性来记录相关的文件名, 起始簇号和簇数,为了删除和添加目录项表方便,使用 ArrayList<Object o> 来将这些文件类的实例保存起来。
2.2 解决思路:
( 1 )为了可以利用起始簇号和簇数这两个信息找到所有保存这个文件的簇的标号,起始簇号保存在相应的文件结构体里,然后通过这个簇号找到第一个簇,在第一个簇里保存第二个簇的簇号,以此类推,最后一个簇保存 0 这个值表示这是最后一个,但是定义的数组是一个二维的数组,所以在这里要做一个映射工作,把二位的数组映射成为一个一维的离散数值,于是我就将 FAT[i][j] 用:簇号 =i * 10 + j + 1 ,最后的加 1 ,是为了让数组的第一个就是 FAT[0][0] 映射成 1 ,这样最后上面所说的保存一个文件的最后的一个簇保存的值为 0 了;
( 2 )为了可以做到申请空间失败的文件不要太多,我设置了一个最大允许的申请空间失败文件数目,当达到这个值的时候,系统会随机删除一些分配空间成功的文件,释放出空间,然后让申请空间失败列表里面的文件重新申请,这样可以减少文件在分配失败列表里的等待时间,但同时会引进一个问题,就是在某一个时段会有表较多的文件释放,这样做不知道是否合符实验册的“一开始申请居多,到后来释放居多”的要求。
( 3 )由于使用 Java 做这个实验,所以我准备开发一个小型界面用于输出分配的结果,而不是使用控制台,所以使用一个 JFrame 作为最外层容器,然后在里面用布局管理布局,通过一个按钮产生一个事件,由监听器调用方法处理,最后用一个不可编辑的 JTextArea 来显示结果。
( 4 )在这一个程序中,多次会需要用到随机数,但是电脑产生的随机数都是伪随机数,有一定的规律,所以我在一些必要的地方用了一些加权计算的方法,对随机数进行改造,尽量做到短时间内不会产生太多相同的随机数。
( 5 )由于 JTextArea 需要一个字符串来到添加输出内容,所以我用了一个全局变量来保存这个字符串,之后的字符串全部添加到已有字符串的尾部。
以下是一个简单的实现,仅供参考,由于编码时间仓促,代码的结构耦合度太高~