Временные, в памяти, файлы в Java - PullRequest
3 голосов
/ 16 июня 2011

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

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

Для этого я в настоящее время сохраняю содержимое во временном файле и передаю временный файл.назад как вложение.Этот подход имел неприятный побочный эффект ранее зашифрованного файла репозитория, хранящегося «в открытом виде» во временном каталоге.

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

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

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

Есть идеи?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 16 июня 2011

Ну, я думаю, вы могли бы хранить данные в Java-объекте, например. HashMap и используйте его в качестве кеша (используйте слабые ссылки, чтобы кеш мог собирать мусор, если сборщик мусора решит это сделать). Если это означает ужасные последствия для количества используемой кучи, тогда вы можете посмотреть на запуск memcache или эквивалент Java, например ehcache для хранения ваших объектов от кучи JVM.

Есть ли причина, по которой вы не можете просто отправить результат обратно, чтобы после его завершения он был очищен JVM?

2 голосов
/ 16 июня 2011

Есть ли вариант Stream s? Недостатком является то, что вы храните все в памяти.

1 голос
/ 16 июня 2011

Есть ли причина, по которой вам нужно передавать объект File обратно, или это то, что вы можете изменить?

Причина, по которой я спрашиваю, заключается в том, что вы можете создать интерфейс, который имеет несколько методов, таких как getName(), getContentStream() и т. Д., И затем передать его обратно вместо конкретного объекта File.

0 голосов
/ 16 июня 2011

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

0 голосов
/ 16 июня 2011

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

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

...