Можно ли хранить массив байтов (необработанные данные) в файле класса java?
Я использую Apache BCEL для динамического создания классов java, каждый из которых будет иметь свой собственный ассоциированный образ. Эти сгенерированные классы реализуют следующий интерфейс:
interface ImageOwner {
byte[] getImage();
}
При динамической реализации метода getImage я мог бы генерировать байт-коды для создания / возврата массива байтов при вызове метода, но я бы предпочел просто вернуть ссылку на массив байтов, если это возможно. Возможно ли хранить необработанные данные внутри файла класса java?
5 ответов:
Я действительно не уверен здесь, потому что это кажется слишком простым вопросом, но для полноты картины, это будет делать то, что я думаю, что вы хотите сделать:
public class ImageOwnerImpl implements ImageOwner { // A literal byte array. Tedious, but you could write code // to auto-generate this source from a file private byte[] imageByteArray = new byte[] { -128, 127, ...etc }; public byte[] getImage() { return imageByteArray; } }
Это литеральный массив байтов, который отвечает на ваш вопрос "как хранить байты в файле класса".
Большинство людей загрузили бы байты изображения из файла во время выполнения в конструкторе, однако у вас может быть какая-то особая потребность, которая гарантирует этот подход
После некоторых исследований лучшим способом, который я нашел для удовлетворения своих потребностей, было кодирование данных изображения base64 и использование пула констант для хранения результирующей строки. Даже при потере =~ 30% это кажется лучше, чем использовать конструктор или другие методы для инициализации поля массива байтов.
Просто определите класс Impl, который имеет статический инициализатор, который загружает необработанные данные из файла, включенного в ваш jar и загруженного через загрузчик классов.
Вы можете просто хранить его в виде массива байтов синтаксис массива в BCEL -
[B
Для массива байтов
[java.lang.String
Для массива строк и т. д.
Единственными константами, которые можно хранить в пуле констант, являются Ints, Floats, Longs, Double, Strings и Classes. Лучше всего просто сохранить его в виде строки и преобразовать в байт[] во время выполнения. Нет необходимости кодировать их в base64, поскольку строки могут обрабатывать нулевые символы, если вы применяете соответствующую модифицированную кодировку unicode.