Файлы произвольного доступа обычно содержат двоичные данные, а не ascii (например, обычный текст).Пример, который вы показываете, это ascii.
Поскольку данные являются ascii, это означает, что не так просто искать различные места в файле.Фактически, обычно подход к получению оценок для Николаса заключается в том, чтобы построчно читать файл и разбирать каждую строку на столбцы.Затем сравните первый столбец для Николя.
Например,
BufferedReader in = new BufferedReader(new FileReader("grades.txt"));
String line = in.readLine();
while(null != line) {
String [] columns = line.split(" ");
if( columns[0].equals("Nickolas") )
System.out.println("I found the line! " + line);
line = in.readLine();
}
РЕДАКТИРОВАТЬ:
Есть несколько способов ускорить это.Вот три:
Сохранение всех данных в HashMap
Если у вас не слишком много записей или если каждая запись не занимает много места, вымог прочитать их все в оперативной памяти.Вы также можете использовать HashMap, чтобы сопоставить имя учащегося с его записью.Например:
HashMap<String, Student> grades = new HashMap<String, Student>();
BufferedReader in = new BufferedReader(new FileReader("grades.txt"));
String line = in.readLine();
while(null != line) {
String [] columns = line.split(" ");
grades.put( column[0],
new Student( /* create student class instance from columns */ );
line = in.readLine();
}
Теперь поиск будет очень быстрым.
Использование бинарного поиска
Если у вас слишком много записей для размещения в ОЗУ, вы можете записать все данные ученика в файл произвольного доступа (двоичный файл).Здесь у вас есть несколько вариантов: вы можете сделать каждую запись разной длины или сделать каждую запись фиксированной длины.Записи фиксированной длины легче выполнять при некоторых видах поиска, например, при бинарном поиске.
Например, если вы знаете, что каждая запись имеет размер 100 байт, вы знаете, как добраться до n-й записи в хранилище двоичных файлов.записи.В основном, читайте 99 * n байтов.Тогда следующие 100 байтов являются сотой записью.
Таким образом, если записи отсортированы по имени студента, вы можете очень легко использовать двоичный поиск, чтобы найти конкретного студента.Этот подход все еще будет быстрым, хотя и не таким быстрым, как структура данных на основе ОЗУ.
Использование HashMap в качестве индекса
Еще один вариант - объединитьдва подхода я упомянул выше.Запишите данные в двоичный файл и сохраните байтовые смещения записей в хэш-карте.Хеш-карта может использовать имя студента в качестве ключа, как и раньше, но затем сохраняет длинное целочисленное смещение записи в файле произвольного доступа.Таким образом, чтобы найти конкретного ученика, вы находите смещение в байтах, используя карту хеша, а затем «ищите» запись в файле и затем читаете ее.Этот последний подход работает, даже если записи различаются по длине.