美文网首页大学编程实验代码首页推荐Java 杂谈
java语言实现操作系统中的文件管理系统

java语言实现操作系统中的文件管理系统

作者: Pursuer96 | 来源:发表于2017-12-08 11:49 被阅读86次
    123.jpg123.jpg

    Basic Framework

    屏幕快照 2017-12-08 11.38.25.png屏幕快照 2017-12-08 11.38.25.png

    fileModel.java

    package File_System_Structure;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    
    public class fileModel {
    //fileModel类用来记录文件或目录的相关属性
    
        public Map<String, fileModel> subMap = new HashMap<String, fileModel>();
        private String name; //文件名或目录名
        private String type; //文件类型
        private int attr; //用来识别是文件还是目录 
        private int startNum;   //在FAT表中起始位置
        private int size;   //文件的大小
        private fileModel father = null;    //该文件或目录的上级目录
        
        public fileModel( String name, String type, int startNum, int size ){
            this.name = name;
            this.type = type;
            this.attr = 2;
            this.startNum = startNum;
            this.size = size;       
        }
        
        public fileModel( String name, int startNum ) {
            this.name = name;
            this.attr = 3;
            this.startNum = startNum;
            this.type = "  ";
            this.size = 1;
        }
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public int getAttr() {
            return attr;
        }
        public void setAttr(int attr) {
            this.attr = attr;
        }
        public int getStartNum() {
            return startNum;
        }
        public void setStartNum(int startNum) {
            this.startNum = startNum;
        }
        public int getSize() {
            return size;
        }
        public void setSize(int size) {
            this.size = size;
        }
    
        public fileModel getFather() {
            return father;
        }
    
        public void setFather(fileModel father) {
            this.father = father;
        }
    
    }
    

    OSManager.java

    package File_System_Structure;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    
    public class OSManager {
        //OSManager这个类实现对文件的各种操作
    
        public Map<String, fileModel> totalFiles = new HashMap<String, fileModel>();
        //定义FAT表
        private int[] fat = new int[128]; 
        //创建根目录 使用fat表的第一项
        private fileModel root = new fileModel("root", 1);
        private fileModel nowCatalog = root;
        
        public OSManager() {
            //将FAT表初始化全部为0,并将第一位设为根目录的空间
            for( int i = 0; i < fat.length ; i++ ) {
                fat[i] = 0;
            }
            fat[ 1 ] = 255; //255表示磁盘块已占用
            fat[ 0 ] = 126; //纪录磁盘剩余块数  
            root.setFather( root );
            totalFiles.put( "root", root );
        }
        
        public int setFat(int size) {
            int[] startNum = new int[128];
            int i = 2; //纪录fat循环定位
            for( int j = 0; j < size; i++ ) {
                if( fat[ i ] == 0 ) {
                    startNum[ j ] = i; //纪录该文件所有磁盘块
                    if( j > 0 ) {
                        fat[ startNum[ j-1 ] ] = i; //fat上一磁盘块指向下一磁盘块地址
                    }
                    j++;
                }
            }
            fat[ i-1 ] = 255;
            return startNum[ 0 ]; //返回该文件起始块盘号
        }
    
    
        /*
         * 
         * 该方法用于删除时释放FAT表的空间
         */
        public void deleteFAT( int startNum ) {
            int nextPoint = fat[ startNum ];
            int nowPoint = startNum;
            int count = 0;
            while( fat[nowPoint ] != 0 ) {
                nextPoint = fat[ nowPoint ];
                if( nextPoint == 255 ) {
                    fat[ nowPoint ] =0;
                    count++;
                    break;
                } else {
                    fat[ nowPoint ] = 0;
                    count++;
                    nowPoint = nextPoint;
                }
            }
            fat[0] += count;
        }
        
    
        /*
         * 
         * 以下为追加内容时修改fat表
         * 
         */
        public void AddFAT(int startNum, int addSize) {
            int nowPoint = startNum;
            int nextPoint = fat[startNum];
            while( fat[ nowPoint ] != 255 ) {
                nowPoint = nextPoint;
                nextPoint = fat[ nowPoint ];
            }//找到该文件终结盘块
    
            for( int i = 2, count = 0; count < addSize; i++ ) {
                if( fat[ i ] == 0 ) {
                    fat[ nowPoint ] = i;
                    nowPoint = i;
                    count++;
                    fat[ nowPoint ] = 255;//作为当前文件终结盘块
                }
            }
        }
        
        /*
         *  以下为创建文件和目录方法
         * 
         */
        public void createFile( String name, String type, int size ) {
            
            if( fat[ 0 ] >= size ) {    //判断磁盘剩余空间是否足够建立文件
                fileModel value = nowCatalog.subMap.get( name ); //该目录下是否寻找同名目录或文件
                if( value != null ) {  //判断该文件是否存在
                    if( value.getAttr() == 3 ) {   //若存在同名目录 继续创建文件
                        int startNum = setFat( size ); 
                        fileModel file = new fileModel( name, type, startNum, size );
                        file.setFather( nowCatalog ); //纪录上一层目录
                        nowCatalog.subMap.put( name, file ); //在父目录添加该文件
                        totalFiles.put( file.getName(), file );
                        fat[ 0 ] -= size;
                        System.out.println( "File is successfully created!" );
                        showFile();
                    } else if( value.getAttr() == 2 ) { //若同名文件已存在,创建失败
                        System.out.println("File fails to create because the file already exists"); 
                        showFile();
                    }
                } else if( value == null ) { //若无同名文件或文件夹,继续创建文件
                    int startNum = setFat( size ); 
                    fileModel file = new fileModel( name, type, startNum, size );
                    file.setFather( nowCatalog ); //纪录上一层目录
                    nowCatalog.subMap.put( name, file ); //在父目录添加该文件
                    totalFiles.put( file.getName(), file );
                    fat[0] -= size;
                    System.out.println( "File is successfully created!");
                    showFile();
                    }
            } else {
                System.out.println("File fails to create because insufficient disk space!");
            }
        
        }
        
        public void createCatolog( String name ) {
            
            if( fat[ 0 ] >= 1 ) { //判断磁盘空间是否足够创建文件夹
                
                fileModel value = nowCatalog.subMap.get( name ); //判断该目录下是否存在同名目录或文件
                if( value != null ) {
                    if( value.getAttr() == 2 ) {
                        int startNum = setFat( 1 );
                        fileModel catalog = new fileModel( name, startNum );
                        catalog.setFather( nowCatalog ); //纪录上一层目录
                        nowCatalog.subMap.put( name, catalog );
                        fat[ 0 ]--;
                        totalFiles.put( catalog.getName(), catalog );
                        System.out.println( "Directory is successfully created!" );
                        showFile();
                    } 
                    else if(value.getAttr() == 3) {
                        System.out.println( "Directory fails to create because the directory already exists!" );
                        showFile();
                    } 
                } 
                else if(value == null) {
                    int startNum = setFat(1);
                    fileModel catalog = new fileModel( name, startNum );
                    catalog.setFather( nowCatalog ); //纪录上一层目录
                    nowCatalog.subMap.put( name, catalog );
                    fat[ 0 ]--;
                    totalFiles.put( catalog.getName(), catalog );
                    System.out.println( "Directory is successfully created!" );
                    showFile();
                }           
            } 
            else {
                System.out.println("Directory fails to create because insufficient disk space!");
            }
        }
        
        
        /*
         * 
         * 以下为显示该目录下的所有文件信息
         * 
         */
        public void showFile() {
            System.out.println("***************** < " + nowCatalog.getName() + " > *****************");
           
            if( !nowCatalog.subMap.isEmpty() ) {
                for( fileModel value : nowCatalog.subMap.values() ) {
                    if(value.getAttr() == 3) { //目录文件
                        System.out.println("File Name:" + value.getName());
                        System.out.println("Operation Type:" + "Folder");
                        System.out.println("Starting Disk Blocks:" + value.getStartNum());
                        System.out.println("Size: " + value.getSize());
                        System.out.println("<-------------------------------------->");
                    }
                    else if(value.getAttr() == 2) {
                        System.out.println("File Name:" + value.getName() + "." + value.getType());
                        System.out.println("Operation Type: " + "Readable & Writable File");
                        System.out.println("Starting Disk Blocks:" + value.getStartNum());
                        System.out.println("Size:" + value.getSize());
                        System.out.println("<-------------------------------------->");
                    }
                }
            }
            for(int i =0; i<2; i++) 
            System.out.println();
            System.out.println("Disk Surplus Space:" + fat[ 0 ] + "            " + "Exit the system please enter:exit");
            System.out.println();
        }
    
        /*
         * 
         * 以下为删除该目录下某个文件
         * 
         */
        public void deleteFile(String name) {
            
            fileModel value = nowCatalog.subMap.get( name );
            if( value == null ) {
                System.out.println("Delete failed, No File or Folder!!");
            } 
            else if( !value.subMap.isEmpty() ){
                System.out.println("Delete failed because the folder contains files!");
            } 
            else {
                nowCatalog.subMap.remove(name);
                deleteFAT(value.getStartNum());
                if(value.getAttr() == 3) {
                    System.out.println("Folder " + value.getName() + " Have been successfully deleted");
                    showFile();
                } 
                else if(value.getAttr() == 2) {
                    System.out.println("File " + value.getName() + "Have been successfully deleted");
                    showFile();
                }
            }
        }
        
        /*
         * 
         * 以下为文件或文件夹重命名方法
         * 
         */
        public void reName(String name, String newName) {
            if( nowCatalog.subMap.containsKey(name) ) {
                if( nowCatalog.subMap.containsKey( newName ) ) {
                    System.out.println("Rename failed because the same name file already exists!"); 
                    showFile();
                } 
                else {
                    fileModel value = nowCatalog.subMap.get( name );
                    value.setName( newName );
                    nowCatalog.subMap.remove( name );
                    nowCatalog.subMap.put( newName, value );
                    System.out.println( "Rename has succeed" );
                    System.out.println();
                    showFile();
                }
            } 
            else {
                System.out.println("Rename failed because there is no this file");
                showFile();
            }
        }
        
        /*
         * 
         * 以下为修改文件类型
         * 修改类型需要打开文件后才能操作
         */
        public void changeType( String name, String type ) {
            
            nowCatalog = nowCatalog.getFather();
            if( nowCatalog.subMap.containsKey( name ) ) {
                fileModel value = nowCatalog.subMap.get( name );
                if(value.getAttr() == 2){
                    value.setType(type);
                    nowCatalog.subMap.remove(name);
                    nowCatalog.subMap.put(name, value);
                    System.out.println("Modify type success!");
                    showFile();
                } 
                else if(value.getAttr() == 3) {
                    System.out.println("Change error because the folder can not modify type!!");
                    openFile( value.getName() );
                }
            } 
            else {
                System.out.println("Modify error, please check whether the input file name is correct!");
            }
        }
        
        /*
         * 以下为打开文件或文件夹方法
         * 
         */
        public void openFile( String name ) {
            if( nowCatalog.subMap.containsKey( name ) ) {
                fileModel value = nowCatalog.subMap.get(name);
                if(value.getAttr() == 2) {
                    nowCatalog = value;
                    System.out.println("The file has been opened and the file size is: " + value.getSize() );               
                }
                else if(value.getAttr() == 3) {
                    nowCatalog = value;
                    System.out.println("The file has been opened!");
                    showFile();
                }
            } 
            else{
                System.out.println("Open failed because the file does not exist!");
            }
        }
        
    
        /*
         * 
         * 以下为向文件追加内容方法
         * 追加内容需要打开文件后才能操作
         */
        public void reAdd(String name, int addSize){
            if( fat[0] >= addSize ) {
                nowCatalog = nowCatalog.getFather();
                if(nowCatalog.subMap.containsKey(name)) {
                    fileModel value = nowCatalog.subMap.get(name);
                    if(value.getAttr() == 2) {
                        value.setSize(value.getSize() + addSize);
                        AddFAT(value.getStartNum(), addSize);
                        System.out.println("Addition content is successful! The file is being reopened...");
                        openFile(name);
                    } 
                    else{
                        System.out.println("The appended content failed, please verify that the filename is entered correctly.");                   
                    }
                }
            }
            else{
                System.out.println("Addition content is failed because insufficient memory space");
                }
            }
        
        
        /*
         * 
         * 以下为返回上一层目录
         * 
         */
        public void backFile() {
            if(nowCatalog.getFather() == null) {
                System.out.println("The document does not have a superior directory!");
            } else {
                nowCatalog = nowCatalog.getFather();
                showFile();
            }
        }
        
        /*
         * 以下根据绝对路径寻找文件
         * 
         */
        public void searchFile(String[] roadName) {
            
            fileModel theCatalog = nowCatalog; //设置断点纪录当前目录
            
            if( totalFiles.containsKey(roadName[roadName.length-1]) ) { //检查所有文件中有无该文件
                nowCatalog = root; //返回根目录
                if( nowCatalog.getName().equals( roadName[0]) ) {   //判断输入路径的首目录是否root
                    System.out.println("yes");
                    for( int i = 1; i < roadName.length; i++ ) {
                        if( nowCatalog.subMap.containsKey( roadName[ i ] ) ) {
                            nowCatalog = nowCatalog.subMap.get( roadName[ i ] ); //一级一级往下查
    
                        } 
                        else {
                            System.out.println("Can't find the file or directory under this path, please check whether the path is correct!");
                            nowCatalog = theCatalog;
                            showFile();
                            break;
                        }
                    }
                    if( roadName.length > 1 ){
                        nowCatalog = nowCatalog.getFather(); //返回文件上一级目录 
                        showFile();
                    }
                } 
                else{
                    nowCatalog = theCatalog;
                    System.out.println("Please enter the correct absolute path!");
                    showFile();
                }
            } 
            else{
                System.out.println("This file or directory does not exist, please enter the correct absolute path!");
                showFile();
            }
        }
        
        /*
         * 以下为打印FAT表内容
         * 
         */
        public void showFAT() {
    
            for(int j=0; j<125; j+=5) {
                System.out.println("第几项 | " + j + "        " + (j+1) + "        " + (j+2) + "        "
                        + (j+3) + "        " + (j+4));
                System.out.println("内容 | " + fat[j] + "        " + fat[j+1] + "        " + fat[j+2]
                         + "        " + fat[j+3] + "        " + fat[j+4]);
                System.out.println();
            }
            int j = 125;
            System.out.println("第几项 | " + j + "        " + (j+1) + "        " + (j+2));
            System.out.println("内容 | " + fat[j] + "        " + fat[j+1] + "        " + fat[j+2]);
            System.out.println();
            showFile();
        }
    }
    

    testFileSystem.java

    package File_System_Structure;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class testFileSystem {
        public static void main(String[] args) {
            try{
                OSManager manager = new OSManager();
                meun(manager);
                }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    
        public static void meun(OSManager manager) {
            Scanner s = new Scanner(System.in);
            String str = null;
            System.out.println("***********" + "Welcome to use the file simulation operating system" + "***********");
            System.out.println();
            manager.showFile();
    
            System.out.println("Please enter command line(Enter help to view the command table):");
            while ((str = s.nextLine()) != null) {
                if (str.equals("exit")) {
                    System.out.println("Thank you!");
                    break;
                }
    
                String[] strs = editStr(str);
                switch (strs[0]) {
                case "createFile":
                    if (strs.length < 4) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } 
                    else {
                        manager.createFile(strs[1], strs[2],
                                Integer.parseInt(strs[3]));
                        }
                    break;
                case "createCatalog":
                    if (strs.length < 2) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } 
                    else {
                        manager.createCatolog(strs[1]);
                        }
                    break;
                case "open":
                    if (strs.length < 2) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } 
                    else {
                        manager.openFile(strs[1]);
                        }
                    break;
                case "cd":
                    if (strs.length < 2) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } 
                    else {
                        manager.openFile(strs[1]);
                        }
                    break;
                case "cd..":
                    manager.backFile();
                    break;
                case "delete":
                    if (strs.length < 2) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } 
                    else {
                        manager.deleteFile(strs[1]);
                        }
                    break;
                case "rename":
                    if (strs.length < 3) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } 
                    else {
                        manager.reName(strs[1], strs[2]);
                        }
                    break;
                case "search": {
                    if (strs.length < 2) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } 
                    else {
                        String[] roadName = strs[1].split("/");
                        manager.searchFile(roadName);
                        }
                    break;
                }
                case "showFAT":
                    manager.showFAT();
                    break;
                case "addContents":
                    if (strs.length < 3) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } 
                    else {
                        manager.reAdd(strs[1], Integer.parseInt(strs[2]));
                        }
                    break;
                case "changeType":
                    if (strs.length < 3) {
                        System.out.println("The command you have entered is incorrect. Please check it.");
                    } else {
                        manager.changeType(strs[1], strs[2]);
                    }
                    break;
                case "help": {
                    System.out.println("The commands are as follows(Space cannot be omitted):");
                    System.out
                            .println("createFile FileName fileType fileSize");
                    System.out.println("<Create a file, for instance:createFile PUSU txt 5 >");
                    System.out.println();
                    System.out
                            .println("createCatalog FatalogName");
                    System.out.println("<Create a directory, for instance:createCatalog myFile >");
                    System.out.println();
                    System.out
                            .println("open Name.FileTypt");
                    System.out.println("<Open a file, for instance:open PUSU.txt >");
                    System.out.println();
                    System.out.println("cd CatalogName");
                    System.out.println("<Open a directory, for instance: cd myFile >");
                    System.out.println();
                    System.out.println("cd..");
                    System.out.println("<Return to the superior directory, for instance: cd..");
                    System.out.println();
                    System.out
                            .println("delete FileName/CatalogName");
                    System.out.println("<Delete a files or a directory (the directory must be empty), for instance:delete PUSU >");
                    System.out.println();
                    System.out
                            .println("rename FileName/CatalogName NewName");
                    System.out.println("<rename a file or a directory, for instance: rename myfile mycomputer >");
                    System.out.println();
                    System.out
                            .println("search FileAbsolutedRoad/CatalogAbsolutedRoad");
                    System.out.println("<Finding a file or directory based on an absolute path, for instance: search root/marco >");
                    System.out.println();
                    System.out.println("showFAT");
                    System.out.println("<Look at the FAT table, for instance: showFAT>");
                    System.out.println();
                    System.out.println();
                    System.out.println("The following command needs to open the file before:");
                    System.out
                            .println("addContents FileName ContentSize");
                    System.out.println("<Add content to a file, for instance:ddContents PUSU 4 >");
                    System.out.println();
                    System.out
                            .println("changeType FileName newType");
                    System.out.println("<Change file type, for instance: changeType PUSU doc>");
                    System.out.println();
                    break;
                }
                default:
                    for(String st : strs)
                        System.out.println(st);
                    System.out.println("The command you have entered is incorrect. Please check it.");
                }
                System.out.println("Please enter command line(Enter help to view the command table)::");
            }
        }
    
        public static String[] editStr(String str) {
            Pattern pattern = Pattern.compile("([a-zA-Z0-9.\\\\/]*) *");// 根据空格分割输入命令
            Matcher m = pattern.matcher(str);
            ArrayList<String>  list = new ArrayList<String>();
            while(m.find()){
                list.add(m.group(1));
            }
            String[] strs = list.toArray(new String[list.size()]);
            
            for (int i = 1; i < strs.length; i++) { // 判断除命令以外每一个参数中是否含有 "."
                int j = strs[i].indexOf(".");
                if (j != -1) { // 若含有"." 将其切割 取前部分作为文件名
                    String[] index = strs[i].split("\\."); // 使用转义字符"\\."
                    strs[i] = index[0];
                }
            } 
            return strs;
        }
    
    }
    

    Running Effect

    屏幕快照 2017-12-08 11.35.56.png屏幕快照 2017-12-08 11.35.56.png
    屏幕快照 2017-12-08 11.36.09.png屏幕快照 2017-12-08 11.36.09.png
    屏幕快照 2017-12-08 11.36.30.png屏幕快照 2017-12-08 11.36.30.png
    屏幕快照 2017-12-08 11.36.40.png屏幕快照 2017-12-08 11.36.40.png

    Source Download

    Please click the address->File System Structure

    Summarize

    用java语言模拟操作系统中的文件管理系统,文件模拟磁盘,数组模拟缓冲区,其中:

    1. 支持多级目录结构,支持文件的绝对读路径;
    2. 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式;
    3. 采用文件分配表FAT;
    4. 实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示
      文件内容、打开文件、读文件、写文件、关闭文件、改变文件属性。可以采用
      命令行界面执行这些命令,也可以采用“右击快捷菜单选择”方式执行命令。
    5. 后编写主函数对所作工作进行测试。

    原文地址:www.iooy.com

    相关文章

      网友评论

        本文标题:java语言实现操作系统中的文件管理系统

        本文链接:https://www.haomeiwen.com/subject/xbheixtx.html