?? maintest.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 + -