Как определить размер динамически размещаемой структуры в Java перед записью в файл? - PullRequest
1 голос
/ 02 мая 2011

Скажем, например, у меня есть сложная динамически распределенная структура (например, двоичное дерево), которую нужно записать в файл, состоящий из разных разделов. Я хотел бы сначала написать размер структуры в виде двойного слова, за которым следует сама структура, однако размер структуры известен только после того, как я записал структуру в файл. В этом случае трудно заранее определить размер структуры в памяти.

Лучше ли записать размер как 0, затем написать структуру, затем выполнить поиск и перезаписать размер с правильным значением? Мне не нравится эта идея, хотя. Есть ли лучший / правильный способ сделать это?

Ответы [ 4 ]

1 голос
/ 02 мая 2011

Просто идея: записать данные в ByteArrayOutputStream, после этого вы сможете вызвать size(), чтобы получить фактическую длину в байтах, и позвонить toByteArray(), чтобы получить байт.буфер, который может быть записан в файл.


Пример кода

public static void main (String[] args) throws java.lang.Exception {
  ArrayList objects = new ArrayList();
  objects.add("Hello World");
  objects.add(new Double(42.0));
  System.out.println(sizeof(objects));               
}

public static int sizeof(Serializable object) {
  ObjectOutputStream out = null;
  ByteArrayOutputStream baos = null;
  try {
    baos = new ByteArrayOutputStream();
    out = new ObjectOutputStream(baos);
    out.writeObject(object);
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    if (out != null) {
      try {
        out.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  return baos != null? baos.size() : -1;
}

Это просто демонстрирует размер эмулятора (которыйотличается от реализации c, потому что он вычисляет размер сериализованного объекта - реализация для raw байтов будет немного отличаться).

0 голосов
/ 02 мая 2011

Пожалуйста, обратитесь к приведенному ниже URL-адресу http://www.javapractices.com/topic/TopicAction.do?Id=83 для расчета размера объекта. Эта утилита кажется полезной для вас.

Чтобы измерить размер конкретного объекта, содержащего данные, измерьте использование памяти JVM перед тем, каки после строительства объекта.

0 голосов
/ 02 мая 2011

Зачем вам вообще нужно писать размер? Разве файл не будет размером структуры после того, как вы его написали?

Если у вас есть переменные компоненты, такие как массивы или списки, вы можете записывать их размеры по мере записи данных. Однако общая длина избыточна и не очень полезна.

Если вам действительно нужно, вы можете сначала записать данные в ByteArrayOutputStream, чтобы получить длину. (Но я в этом серьезно сомневаюсь)

0 голосов
/ 02 мая 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...