Сохранение нескольких изображений в одном файле - PullRequest
1 голос
/ 25 июня 2010

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

Как мне поступить, особенно если я хочу сохранить вместе с ним другие данные, возможно, объекты и тому подобное.Я знаю, что вы можете использовать класс ObjectOutputStream, но я не уверен, как интегрировать его с изображениями.

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

Заранее спасибо.

[РЕДАКТИРОВАТЬ - Из ответов + Комментарий относительно Zip-файлов]

Почтовый индекс может быть в состоянии выполнить работу.

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

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

Ответы [ 4 ]

2 голосов
/ 25 июня 2010

В вашем случае я бы использовал библиотеку ZIP, чтобы упаковать все изображения в файл ZIP.Для метаданных, которые вы хотите сохранить вместе с ними, используйте файлы XML.Сегодня XML и ZIP являются стандартом де-факто, они просты в обращении и хотя и гибки, если вы хотите добавлять новые файлы или метаданные.Существуют также инструменты для сериализации ваших объектов в XML.(Я не знаю их точно в Java, но я уверен, что есть.)

1 голос
/ 26 июня 2010

Вы можете программно создать zip-файл и читать zip-файл из Java, нет необходимости представлять его как обычный .zip-файл.

См .: java.io.zip pacakge для получения дополнительной информации и этих других для примеров кода о том, как прочитать / напишите zip, используя java.

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

Подробнее о формате интернет-сообщения можно прочитать здесь

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

Это может быть:

  • Заголовок с именами (и количеством) файлов в этом пакете.
  • После списка разделителей (например, * 1026)* некоторый идентификатор, чтобы знать, что вы закончили с этим содержимым)
  • Фактическое содержимое

Итак, вы создаете пакет с чем-то вроде следующего:

public void createBundle() {
    ZipOutputStream out = .... 
    writeHeader( out );
    writeLimits( out yourFiles );
    for( File f : youFiles ) {
        writeFileTo( f, out );
     }
     out.close();
}

Сортировка ...

И в результате получится заархивированный файл с чем-то вроде:

 filenames =a.jpg, b.xml, c.ser, d.properties, e.txt
 limits.a.jpg =poiurqpoiurqpoeiruqeoiruqproi
 limits.b.xml =faklsdjfñaljsdfñalksjdfa
 limit.s.ser =sdf09asdf0as9dfasd09fasdfasdflkajsdfñlk
 limit.d.properties =adfa0sd98fasdf90asdfaposdifasdfklasdfkñm
 limit.e.txt =asdf9asdfaoisdfapsdfñlj
 attachments=
 <include binary data from a.jpg here>
 --poiurqpoiurqpoeiruqeoiruqproi
 <include binary data from b.xml here>
 --faklsdjfñaljsdfñalksjdfa

и т. Д.

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

Если вам удастся включить библиотеку MIME в свое приложение, это может сэкономить вам много времени.

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

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

Поскольку это широко, вы можете спросить о конкретных частях здесь: https://stackoverflow.com/questions/ask

0 голосов
/ 26 июня 2010

Я знаю, что вы можете использовать класс ObjectOutputStream, но я не уверен, как интегрировать его с изображениями.

Изображения являются двоичными данными, поэтому читаем их в byte[] и пишемbyte[] до ObjectOutputStream должно работать.Однако это всего лишь перебор памяти, поскольку каждый byte съедает хотя бы один байт памяти JVM.Вы должны принять это во внимание.

0 голосов
/ 25 июня 2010

Да, просто упакуйте / распакуйте их с помощью java.util.zip. * Что довольно просто.Каждая версия Windows начиная с XP имеет встроенную поддержку zip, так что все в порядке.Существует также много хороших (и более быстрых) бесплатных библиотек zip для java / c #.

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