⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maintest.java

📁 Disk simulation program. Simulates file-system with direct access.
💻 JAVA
字号:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MainTest
{
    public static Disk disk;
    public static IndexedFile idxFile;

    /**
     * Parses data from file into list of Records
     *
     * @return list of Records
     */
    public static List<Record> parseDataFromFile()
    {
        List<Record> records = new ArrayList<Record>();
        try
        {
            File f = new File("Mountains.txt");
            BufferedReader br = new BufferedReader(new FileReader(f));
            String data = null;
            do
            {
                data = br.readLine();
                if (data != null)
                {
                    Record r = new Record();
                    r.parseFromFile(data);
                    records.add(r);
                }
            }
            while (data != null);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.exit(-1);
        }
        //Sort list of records by name field
        Collections.sort(records);
        System.out.println("Loaded " + records.size() + " records from file");
        return records;
    }

    /**
     * Fills disk with data
     *
     * @param records - data
     * @return first index sector
     */
    public static int fillDiskWithData(List<Record> records)
    {
        int recordsPerSector = disk.getSectorSize() / Record.RECORD_SIZE;
        int currSector = 0;
        int currOffset = 0;
        int currRecord = 0;
        boolean endOfRecords = false;
        while (!endOfRecords)
        {
            char[] buffer = new char[disk.getSectorSize()];
            for (int i = 0; i < (recordsPerSector - 3); i++)
            {
                currOffset = i * Record.RECORD_SIZE;
                Record r = records.get(currRecord);
                char[] data = r.convertToData();
                System.arraycopy(data, 0, buffer, currOffset, data.length);
                currRecord++;
                if (currRecord >= records.size())
                {
                    endOfRecords = true;
                    break;
                }
            }
            disk.writeSector(currSector, buffer);
            currSector++;
        }
        System.out.println("Written " + (currSector - 1) + " data sectors to disk");
        return currSector;
    }

    /**
     * Building index
     *
     * @param indexStartSector - first index sector
     * @return IndexedFile
     */
    public static IndexedFile buildIndex(int indexStartSector)
    {
        System.out.println("Starting building index...");
        int idxLevels = 0;
        int currIdxLevelStartSector = indexStartSector;
        int idxSectors = 0;
        int idxRootSector = 0;
        int idxRecords = 0;
        int currDataSector = 0;
        int currIdxSector = indexStartSector;
        int currIdxOffset = 0;

        IndexedFile iFile = null;
        char[] readBuffer = new char[disk.getSectorSize()];
        char[] writeBuffer = new char[disk.getSectorSize()];
        char[] recordBuffer = new char[Record.RECORD_SIZE];
        boolean wasWritten = false;

        while ((currIdxSector - currDataSector) > 1)
        {
            System.out.println("Started new index level " + idxLevels + " at sector " + currIdxLevelStartSector);
            while (currDataSector < currIdxLevelStartSector)
            {
                wasWritten = false;
                //Read current data sector to readBuffer
                disk.readSector(currDataSector, readBuffer);
                System.arraycopy(readBuffer, 0, recordBuffer, 0, recordBuffer.length);
                System.out.println("Read data sector " + currDataSector);
                //Parse data record
                Record r = new Record();
                r.parseFromData(recordBuffer);

                //Create index record and its char[] representation
                IndexRecord ir = new IndexRecord(Record.NAME_LENGTH, r.getName(), String.valueOf(currDataSector).toCharArray());
                char[] irData = ir.getData();

                //Write index record to writeBuffer
                System.arraycopy(irData, 0, writeBuffer, currIdxOffset, irData.length);
                System.out.println("Written index record to sector " + currIdxSector + ", offset " + currIdxOffset);
                currDataSector++;
                currIdxOffset += irData.length;
                idxRecords++;

                //Check if write buffer full
                if ((currIdxOffset + irData.length) >= writeBuffer.length)
                {
                    //Write buffer to disk
                    disk.writeSector(currIdxSector, writeBuffer);
                    wasWritten = true;
                    System.out.println("Index sector " + currIdxSector + " was written to disk");
                    //Clear buffer
                    Arrays.fill(writeBuffer, '\0');

                    //Seek to new idx sector
                    currIdxOffset = 0;
                    currIdxSector++;
                    idxSectors++;
                    continue;
                }
            }
            //Increase idx levels number
            idxLevels++;
            currIdxLevelStartSector = currIdxSector;
        }
        if (!wasWritten)
        {
            disk.writeSector(currIdxSector, writeBuffer);
            idxSectors++;
            idxRootSector = currIdxSector;
            System.out.println("Last index sector " + currIdxSector + " was written to disk");
            System.out.println(idxRecords + " index records was created");
        }
        iFile = new IndexedFile(disk, Record.RECORD_SIZE, Record.NAME_LENGTH, 0, indexStartSector, idxSectors, idxRootSector, idxLevels);
        System.out.println("\nCreated " + iFile.toString());
        return iFile;
    }


    public static String getInfoFromUser(String text) throws Exception
    {
        System.out.print(text);
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader bis = new BufferedReader(isr);
        return bis.readLine();
    }

    public static void startMenu() throws Exception
    {
        StringBuilder sb = new StringBuilder();
        sb.append("\n1 - Insert new record\n");
        sb.append("2 - Find record\n");
        sb.append("3 - Quit\n");

        int i = 0;

        while (i != 3)
        {
            System.out.println(sb.toString());
            String choice = getInfoFromUser("Enter your choice: ");
            try
            {
                i = Integer.parseInt(choice);
            }
            catch (NumberFormatException e)
            {
                continue;
            }

            String name = "";
            Record r = null;
            boolean isOk = false;

            switch (i)
            {
                case 1:
                    name = getInfoFromUser("Enter mountain name: ");
                    String country = getInfoFromUser("Enter country: ");
                    String alt = getInfoFromUser("Enter altitude: ");

                    r = new Record(name.toCharArray(), country.toCharArray(), alt.toCharArray());
                    isOk = idxFile.insertRecord(r.convertToData());

                    if (isOk)
                        System.out.println("Insertion was successful");
                    else
                        System.out.println("Insertion failed - record already exists");

                    break;

                case 2:
                    name = getInfoFromUser("Enter mountain name: ");

                    r = new Record(name.toCharArray(), new char[]{'\0'}, new char[]{'\0'});
                    char[] rec = r.convertToData();
                    isOk = idxFile.findRecord(rec);

                    if (isOk)
                    {
                        System.out.println("\nRecord found:");
                        r = new Record();
                        r.parseFromData(rec);
                        System.out.println(String.valueOf(r.getName()).trim() + ", country: " + String.valueOf(r.getCountry()).trim() + ", altitude: " + String.valueOf(r.getAltitude()).trim() + " ft.");
                    }
                    else
                        System.out.println("Record not found:");

                    break;

                case 3:
                    System.exit(0);
                    
                default:
            }
        }
    }

    /**
     * Main method
     *
     * @param args - not used
     */
    public static void main(String[] args)
    {
        disk = new Disk();
        List<Record> records = parseDataFromFile();
        int idxStart = fillDiskWithData(records);
        idxFile = buildIndex(idxStart);

        try
        {
            startMenu();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -