主要研究内容
模拟采用显示链接文件结构和基于位示图磁盘分配算法的单用户磁盘文件管理系统,包括:文件的创建、文件的删除、文件的读取、磁盘分配回收。
效果如下
下面这个是初始状态下的磁盘,假设磁盘共有500个磁盘块,1代表该磁盘块已经被之前的文件占用了,0代表未被占用
创建文件
先创建了连个文件,一个是1.txt,大小为50个磁盘块;另外一个文件是2.txt,大小为35个磁盘块。
创建完后查看磁盘,其中,2是文件1.txt的id,使用id=2代表文件1.txt的内容将其填入了空闲的磁盘块,同理3是文件2.txt的id,将其填入空闲的磁盘块
下面是创建完1.txt和2.txt后的位示图
下面是文件起始块号表和FAT表的内容,因为表格过大,分为左右两边,上面一张是左边,下面一张是右边,FAT表本质上是一个一维整型数组,不过为了方便,通过表格的方式展示,文件起始块号表和FAT表不对之前已经存在的文件做记录
还有 删除和读取文件,不再做演示
本程序使用JAVA完成,程序源码如下:
package Practice; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.Scanner; public class FileManage { static int[] diskBlock=new int[500]; //磁盘 static Map<String,Integer> index=new HashMap<>(); //记录文件的起始块号 static int[] FAT=new int[500]; //FAT文件分配表 static int[][] bitmap=new int[10][50]; //位示图 static int diskSize=500; //记录磁盘大小 //初始化出一些已经被使用的磁盘块,并建立初始状态下的位示图 static{ Random random=new Random(); for(int i=0;i<300;i++){ diskBlock[random.nextInt(500)]=1; } for (int i=0;i<500;i++) { if (diskBlock[i] == 1) { diskSize--; bitmap[i/50][i%50]=1; } } System.out.println("初始状态下:"); checkDisk(); } public static void main(String[] args) { System.out.println( ); System.out.println("------------------------------------"); System.out.println(" 1、创建文件 2、删除文件 "); System.out.println(" 3、读取文件 4、查看已创建文件 "); System.out.println(" 5、查看所有状态 6、结束进程 "); System.out.println("------------------------------------"); while(true){ System.out.print("请输入菜单号:"); Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); if(n==1){ createFile(); }else if(n==2){ deleteFile(); }else if(n==3){ checkFile(); }else if(n==4){ System.out.println(); System.out.println("已创建文件:"+index.keySet()); }else if(n==5){ checkAll(); }else if(n==6){ System.out.println("进程结束!"); break; }else{ System.out.println("请输入正确的菜单号!"); } } } //创建文件 public static void createFile(){ System.out.println(); System.out.print("请输入文件名:"); Scanner scanner=new Scanner(System.in); String fileName=scanner.next(); System.out.print("请输入文件大小:"); int size=scanner.nextInt(); File1 file1=new File1(fileName,size); //查看是否有重名文件 if(index.containsKey(file1.fileName)){ System.out.println("文件名已存在!"); return; } //先查看是否还有足够的磁盘空间 if(file1.size>diskSize){ System.out.println("磁盘空间不足!"); return; } //查看位示图,找到空余的磁盘块号,并占用相应的磁盘块,同时在FAT分配表中做相应记录 int tempSize= file1.size; int flag=0; for(int i=0;i<10;i++){ for(int j=0;j<50;j++){ if(tempSize==0){ break; } if(bitmap[i][j]==0){ diskBlock[i*50+j]=file1.fileId; bitmap[i][j]=1; if(tempSize== file1.size){ index.put(file1.fileName,i*50+j); flag=i*50+j; }else if(tempSize==1){ FAT[flag]=i*50+j; FAT[i*50+j]=-1; }else{ FAT[flag]=i*50+j; flag=i*50+j; } tempSize--; } } } //更新文件diskSize diskSize-= file1.size; System.out.println("创建成功!"); } //删除文件 public static void deleteFile(){ System.out.println(); System.out.print("请输入要删除的文件名:"); Scanner scanner=new Scanner(System.in); String fileName=scanner.next(); //判断该文件是否存在 if(!index.containsKey(fileName)){ System.out.println("该文件不存在!"); return; } //根据FAT表,找到要删除的文件的磁盘号,然后到磁盘中以及位示图中,将相应位置置为0 int flag=index.get(fileName); while(flag!=-1){ int temp=FAT[flag]; FAT[flag]=0; diskBlock[flag]=0; bitmap[flag/50][flag%50]=0; flag=temp; } index.remove(fileName); System.out.println("删除成功!"); } //读取文件 public static void checkFile(){ System.out.println(); System.out.print("请输入要读取的文件名:"); Scanner scanner=new Scanner(System.in); String fileName=scanner.next(); //判断该文件是否存在 if(!index.containsKey(fileName)){ System.out.println("该文件不存在!"); return; } System.out.print("读取到的磁盘块为:"); int flag=index.get(fileName); while(flag!=-1){ int temp=FAT[flag]; System.out.print(flag+"->"+diskBlock[flag]+" "); flag=temp; } System.out.println(); } //查看磁盘状态 public static void checkDisk(){ System.out.println("磁盘状态:"); for(int i=0;i<500;i+=50){ for(int j=i;j<50+i;j++){ System.out.print(diskBlock[j]+" "); } System.out.println(); } System.out.println("磁盘剩余大小:"+diskSize); } //查看位示图 public static void checkBitmap(){ System.out.println("位示图表:"); for(int i=0;i<10;i++){ for(int j=0;j<50;j++){ System.out.print(bitmap[i][j]+" "); } System.out.println(); } } //查看文件起始块号表 public static void checkIndex(){ System.out.println("文件起始块号表:"+index); } //查看FAT文件分配表 public static void checkFAT(){ System.out.println("FAT文件分配表:"); for(int i=0;i<500;i+=50){ System.out.print(i+"~"+(i+49)+"\t"); for(int j=i;j<50+i;j++){ System.out.print(FAT[j]+"\t"); } System.out.println(); } } //展示全部状态 public static void checkAll(){ System.out.println(); checkDisk(); System.out.println(); checkBitmap(); System.out.println(); checkIndex(); System.out.println(); checkFAT(); } } class File1{ static int id=2; public int fileId; //文件id public String fileName; //文件名 public int size; //文件大小 public File1(String fileName,int size){ this.fileId=id; this.fileName=fileName; this.size=size; id++; } }