Файлы случайного доступа обычно содержат двоичные данные, а не данные 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();
}
EDIT:
Есть несколько способов, чтобы ускорить это. Вот три:
хранение всех данных в 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 байт являются 100-й записью.
Таким образом, если записи отсортированы по имени студента, вы можете очень легко использовать двоичный поиск, чтобы найти конкретного ученика. Этот подход будет по-прежнему быстрым, хотя и не таким быстрым, как структура данных на основе RAM.
Использование HashMap в качестве индекса
Еще одним вариантом является сочетание этих двух подходов я уже упоминал выше. Запишите данные в двоичный файл и сохраните смещения байта записей в хэш-карте. Хэш-карта может использовать имя студента в качестве ключа, как и раньше, но затем сохраняет длинное целочисленное смещение к записи в файле произвольного доступа. Таким образом, чтобы найти конкретного ученика, вы найдете смещение байта с помощью хэш-карты, а затем «ищите» запись в файле, а затем прочитайте ее. Этот последний подход работает, даже если записи различаются по длине.
Вы должны его искать самостоятельно. Нет волшебства. Я бы предложил использовать только «BufferedReader» и игнорировать любую строку, которая не соответствует шаблону, и перейти к следующему. – BalusC