Как я могу вернуть адрес строки в файле произвольного доступа? - PullRequest
1 голос
/ 19 января 2012

Я пытаюсь создать файл произвольного доступа в Java.Я пишу что-то в новой строке.

  1. Как я могу вернуть адрес этой строки в Java?

Кроме того, я немного запутался с RAF.

Например, у меня есть файл, который состоит из следующих записей в алфавитном порядке

Джордж 10 10 8

Мэри 9 10 10

Ник 8 8 8

Николай 10 10 9

Я хотел бы вернуть оценки Николаса.Как я могу объявить это в RAF?

Есть ли какой-нибудь метод, который может "прочитать (" Николай ")" и вернуть мне строку?

Спасибо, заранее

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Файлы произвольного доступа обычно содержат двоичные данные, а не 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 в качестве индекса

Еще один вариант - объединитьдва подхода я упомянул выше.Запишите данные в двоичный файл и сохраните байтовые смещения записей в хэш-карте.Хеш-карта может использовать имя студента в качестве ключа, как и раньше, но затем сохраняет длинное целочисленное смещение записи в файле произвольного доступа.Таким образом, чтобы найти конкретного ученика, вы находите смещение в байтах, используя карту хеша, а затем «ищите» запись в файле и затем читаете ее.Этот последний подход работает, даже если записи различаются по длине.

2 голосов
/ 19 января 2012

Нет такой вещи как «линия». Однако есть разделители строк (символ новой строки, '\n'). Вы можете написать строку, но это только записывает данные, за которыми следует новая строка. Вы можете прочитать строку, но, опять же, она читает только до тех пор, пока не найдет символ новой строки или конец файла.

Таким образом, чтобы найти строку n , вы должны продолжать читать, пока не наберете n-1 символов новой строки, и продолжать читать, пока не найдете следующий (или конец) файла).

...