чтение данных из файла случайного доступа

Вот функция, которая у меня есть:

// Read a record from the specified RandomAccessFile
   public void read( RandomAccessFile file ) throws IOException    {
      account = file.readInt();
      byte b1[] = new byte[ 15 ];
      file.readFully( b1 );
      firstName = new String( b1, 0 );
      firstName = firstName.trim();
      byte b2[] = new byte[ 15 ];
      file.readFully( b2 );
      lastName = new String( b2, 0 );
      lastName = lastName.trim();
      balance = file.readDouble();
   }

Мне нужно иметь возможность читать из файла случайного доступа для одного из моих экзаменов, и приведенный выше код немного сбивает с толку.

вот что я предполагаю, происходит, буду признателен, если вы поправите меня, если я ошибаюсь.

мы берем file и readInt из файла и назначаем их account. затем, я думаю, мы создаем новый байт размером 15 и читаем первое имя из файла в байт, а затем присваиваем firstname. теперь вот что я не понимаю, что делает readFully? и как приведенный выше код знает, что нужно перейти к следующему значению для lastName. Проще говоря,

byte b1[] = new byte[ 15 ];
      file.readFully( b1 );
      firstName = new String( b1, 0 );
      firstName = firstName.trim();

VS

      byte b2[] = new byte[ 15 ];
      file.readFully( b2 );
      lastName = new String( b2, 0 );
      lastName = lastName.trim();
      balance = file.readDouble();

Почему это не дает того же значения? мы угадываем, какова длина каждого значения (имя, фамилия и т. д.)?


person Ahoura Ghotbi    schedule 04.04.2013    source источник
comment
Вы читали какие-либо javadocs для RandomAccessFile?   -  person jtahlborn    schedule 04.04.2013
comment
Да, я знал, но мне пришлось изучить много разных вещей, поэтому это немного сбивает с толку, поэтому я надеялся, что кто-то сможет объяснить это простыми словами.   -  person Ahoura Ghotbi    schedule 04.04.2013


Ответы (2)


Как говорит апи:

Считывает b.length байт из этого файла в массив байтов, начиная с текущего указателя файла. Этот метод многократно считывает файл до тех пор, пока не будет прочитано запрошенное количество байтов.

    public void write(RandomAccessFile file) throws IOException {
    file.writeInt(account);
    byte b1[] = new byte[15];
    // set firstname to b1
    file.write(b1);
    byte b2[] = new byte[15];
    // set lastname to b2
    file.write(b2);
    double balance =123.1;
    file.writeDouble(balance);
}

если вы сгенерируете файл точно так же, как указано выше, прогресс чтения будет в порядке.

person BlackJoker    schedule 04.04.2013
comment
но является ли приведенный выше код надежным? что делать, если значение больше 15 байт? не могли бы вы объяснить, как именно java знает, какое следующее значение? если запись показывает 1 name lastname 10.00, как ее будет читать приведенный выше код? - person Ahoura Ghotbi; 04.04.2013
comment
Это зависит от того, как создается файл. Если каждая запись хранится как 4 байта + 15 байт + 15 байт + 8 байт, они будут прочитаны правильно. - person BlackJoker; 04.04.2013
comment
о, хорошо, это была запутанная часть, поэтому вы должны учитывать байты, чтобы иметь возможность найти правильное значение? - person Ahoura Ghotbi; 04.04.2013

Если это школьный/университетский экзамен, имейте в виду, что они намеренно используют нелепости, чтобы сбить вас с толку.

Учитывая комментарий из кода, который вы разместили:

Прочитать запись из указанного RandomAccessFile.

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

  • аккаунт - 4Б (размер int)
  • имя - 15Б
  • фамилия - 15Б
  • баланс - 8Б

Бьюсь об заклад, что предполагается, что данные записаны правильно - то есть именно в указанном выше порядке и длине. Если это не так, например. есть строка вместо целого числа или имя больше, это, вероятно, приведет к ошибке или неправильной интерпретации данных - поэтому ваши фрагменты дают разные результаты.

Это двоичный файл, из которого вы читаете в любом случае, если вы хотите что-то прочитать, если это, теперь вы должны указать точный формат, в котором оно было написано. Иначе это все равно, что расшифровывать инопланетные буквы.

Что касается RandomAccessFile.readFullyMethod:

Считывает байты b.length из этого файла в массив байтов, начиная с текущего указателя файла. Этот метод многократно читает файл, пока не будет прочитано запрошенное количество байтов. Этот метод блокируется, пока не будет прочитано запрошенное количество байтов, не будет обнаружен конец потока или не возникнет исключение.

person linski    schedule 04.04.2013