Я пытаюсь записать свои пространственные данные из таблицы в файл. Но мне нужно знать точный размер данных на диске перед записью на диск. В качестве примера предположим, что я пишу на диск, используя следующий код:
FileOutputStream fos = new FileOutputStream("t.tmp",false);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(gid);
oos.writeUTF(fullname);
oos.writeInt(d.shape.length);
oos.write(d.shape);
oos.close();
fos.close();
Я думал, что размер файла на диске равен:
size= 4B {for gid, int} + fullname.getBytes.length() {string} + 4B {d.shape.length, int} + d.shape.length
но на самом деле это сильно отличается от реального размера файла на диске.
Я также заметил, что даже создание пустого файла с помощью ObjectOutputstream приводит к 4 байтам места на диске.
Любая помощь в том, как рассчитать размер файла на диске?
(Я не могу записать данные на диск, а затем прочитать реальный размер. Это снизит производительность. Вместо этого мне нужно рассчитать размер данных на диске на основе значений данных, хранящихся в памяти.)
writeObject()
? Или ваш примерный код настолько сложен, насколько это возможно? Кажется, вам лучше использовать DataOutputStream а>. (ObjectOutputStream
записывает информацию заголовка потока и отслеживает ссылки на уже записанные объекты, поэтому он может просто написать ссылку и т. д. - все это помешает вашим усилиям по предварительному расчету размера.) - person Greg Kopff   schedule 26.06.2012ObjectOutputStream
заключается в его способности автоматически сериализовать сложный граф объектов. Однако это не похоже на то, что вы делаете, поэтому я бы посоветовал вам отказаться отObjectOutputStream
и просто написать байты самостоятельно, используяDataOutputStream
.DataOutputStream
ничего не делает автоматически, так что вы сможете выполнять расчеты размера, которые ожидаете. Обратите внимание на Javadoc дляDataOutputStream.writeUTF()
, так как он записывает 2 байта данных длины, а затем String. - person Greg Kopff   schedule 26.06.2012