您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 操作系统课程设计--二级文件系统(java)
操作系统课程设计报告二级文件系统(java)姓名:李爱军班级:计091-2学号:200925501211指导教师:翟一鸣日期:2012-08-302目录一、实验目的.............................................................................................3二、实验内容.............................................................................................3三、实验过程.............................................................................................3四、设计思路.............................................................................................4五、实现的功能........................................................................................5六、实验感悟.............................................................................................5附录:程序主要代码................................................................................53一、实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。二、实验内容为linux系统设计一个简单的二级文件系统。要求做到以下几点:1、可以实现下列几条命令(至少4条);login用户登陆dir列文件目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件2、列目录时要列出文件名、物理地址、保护码和文件长度;3、源文件可以进行读写保护。三、实验过程1、程序流程登录输入用户名用户存在进入目录管理注册登陆完成否是4用户登录流程列文件目录流程2、主要类介绍(1)、publicclassSystems文件系统的主类(2)、publicclassMyFile自定义的文件结构体类(3)、publicclassMyDirectory自定义的目录的结构体类(4)、publicclassSuperBlockimplementsSerializable超级快结构体类(5)、publicclassINodeimplementsSerializable,ComparableINode自定义INode节点实体类(6)、publicclassFileTools自定义数据文件的读写工具类四、设计思路1、一个磁盘的有扇区(超级块)、索引块区(Inode节点区)、存储区(数据块区)2、扇区中主要是存储磁盘的总大小、空闲Inode节点、使用的Inode节点、已使用空间、列出目录文件读取文件展示文件完成是否当前用户文件否是5空闲空间。3、Inode节点主要存储:当前的地址、文件的长度、用户名、读写的权限、文件是否打开、文件的类型(0代表目录,1代表普通文件)、对应文件块的地址(即序号)、父节点块号、自己的当前节点的序号。4、自定义目录:文件对应Inode的索引、文件的名字、当前目录下的Inode和文件的对应关系(privateTreeMapInteger,Integertree)5、自定应文件:文件对应Inode的索引、文件名字、/数据内容。6、控制类:得到用户的输入操作调用相应的操作。五、实现的功能1、用户的注册和登陆2、dir列文件目录3、create创建文件4、delete删除文件5、read读文件6、write写文件7、cd更改目录8、rename重命名文件名六、实验感悟首先想说一句话:“没被逼着是不会出大力的”。解释一下,看到同学们用的都是以前的C或者是C++的文件代码。我自己考来一份,这个悲催啊,自己的C\C++的功底实在是太差劲的,直接看不懂,也没那耐心烦。从网上down了几份java的代码。其中有一份写的不错,很巧妙的实现了老师的要求。可是以真正的课程设计的原理真是风马牛不相及啊。怕老师不让过,于是下决心自己写一下(觉得自己对相应的原理还是知道一些的)。我的痛苦的过程也就开始了。我真的有一次体味到写程序最难得不是代码的编写,而是思路、思路、思路。前一天很容易的就实现了用户登录相应的操作。同时数据读写的工具类和项目的框架也算是粗糙的完成了。可是接下来就写不下去了,原因是Inode和file或者directory之间是如何关联的。这三个类的属性是如何定义和分配的。自己拿笔也在纸上画,又和舍友李新等同学探讨。有思考了一天多,模模糊糊的开始写,又改有写。就这样一点一点的写着改着,痛苦着并高兴着。终于粗糙的写完了。时间太短啊,还有许多可以优化的地方还没来得修改。周五下午,怀着一颗忐忑的心找老师验程序。当听到老师的一句:“写的还不错么!”那种高兴无法用言语来形容!这几天的痛苦、熬夜都值了。谢谢老师的夸奖!附录:程序主要代码1.Systems.javaimportjava.util.ArrayList;importjava.util.Iterator;importjava.util.Scanner;importjava.util.Set;importjava.util.StringTokenizer;/***文件管理系统主类**@authorliaijun**/publicclassSystems{Scannersc=newScanner(System.in);//从控制台读取数据publicstaticSuperBlocksb=null;//超级块记录虚拟磁盘的总信息publicstaticArrayListStringusers;//用户名数组;publicstaticINode[]inodes=newINode[100];//i节点记录数据结构publicstaticObject[]blocks=newObject[100];//文件块的结构;publicstaticStringname=null;//当前登录用户名publicstaticINodenow_inode=null;//当前节点publicstaticObjectnow_file=null;//publicstaticINodefather;//父节点//publicstaticINodeme;//自己的当前节点/***@paramargs*/publicstaticvoidmain(String[]args){Systemssts=newSystems();sts.init();//初始化数据;sts.login();}publicvoidinit(){users=(ArrayListString)FileTools.read(f:\\users.dat);/**if(null!=FileTools.read(f:\\users.dat)){//inodes=(INode[])*FileTools.read(f:\\users.dat);}*/sb=(SuperBlock)FileTools.read(f:\\super.dat);if(null==sb||sb.getAlreadyuse()==0){for(inti=0;i100;i++){inodes[i]=newINode();}sb=newSuperBlock();for(inti=0;i100;i++){sb.setInode_free(i);}FileTools.write(f:\\super.dat,sb);}if(null==users){users=newArrayListString();//存放整个文件系统users.add(admin);FileTools.write(f:\\users.dat,users);}}publicvoidlogin(){System.out.println(***************欢迎使用该文件管理系统*************);System.out.println(请先登录-);name=sc.next();if(!this.isInNames(name)){System.out.println(该用户名7不存在!是否注册该用户?y/n);if(y.equals(sc.next())){if(regeist(name)){System.out.println(name+注册成功!);login();}else{System.out.println(注册失败!);System.exit(0);}}else{login();}}else{now_inode=getInode(name+-);//得到当前的inodenow_file=blocks[now_inode.getAddress()];//得到当前的目录System.out.println(登录成功);execute();}}/***命令执行的主方法*/publicvoidexecute(){Stringcommond=null;Stringcmd[]=null;//操作命令数组cmd[0]操作的命令cmd[1]操作的文件/**INodeid=newINode();//文件的节点intfileNumber=0;//拥有文件的总数int*getNumber=0;//存储打开文件的节点索引号,或者说是虚拟的内存地址intemptyNumber=0;//*空的文件目录的索引*///System.out.println(now_inode.getPath());while(true){System.out.print(now_inode.getPath());commond=sc.nextLine();if(commond.equals())commond=sc.nextLine();cmd=commond.trim().split();//列举同一个人用户名的文件目录if(cmd[0].trim().equals(dir)){intm=0;System.out.println(文件名\t用户名\t地址\t文件长度\t只读1/可写2\t打开控制);if(now_fileinstanceofMyDirectory){MyDirectorynow__real_file=(MyDirectory)now_file;m=now__real_file.getTree().size();if(m==0){System.out.println(没有目录项);}else{SetIntegerdir_inodes=now__real_file.getTree().keySet();IteratorIntegeriteratore=dir_inodes.iterator();while(iteratore.hasNext()){Objectfile=blocks[now__real_file.getTree().get(8iteratore.next())];if(fileinstanceofMyDirectory){MyDirectoryreal_file=(MyDirectory)file;INodereal_inode=inodes[real_file.getInode_address()];//文件名\t用户名\t地址\t文件长度\t只读1/可写2\t打开控制\t创建时间System.out.println(real_
本文标题:操作系统课程设计--二级文件系统(java)
链接地址:https://www.777doc.com/doc-5473818 .html