Создайте временный файл, затем загрузите его с помощью FTP (Java webapp) - PullRequest
0 голосов
/ 25 января 2011

Пользователи моего веб-приложения имеют возможность запустить процесс, который генерирует CSV-файл (заполняемый некоторыми данными из базы данных) и загружает его на FTP-сервер (и другой отдел будет читать файл оттуда).Я просто пытаюсь понять, как лучше всего это реализовать.Я использую commons net ftp функциональность.Он предлагает два способа загрузки данных на FTP-сервер:

  • storeFile (String remote, InputStream local)
  • storeFileStream (String remote)

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

Каков наилучший способ создания временного файла в веб-приложении?Безопасно и рекомендуется использовать File.createTempFile?

Ответы [ 2 ]

1 голос
/ 25 января 2011

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

СоздайтеРеализация InputStream, которая считывает данные базы данных построчно, преобразует их в CSV и публикует данные с помощью методов read ().

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

0 голосов
/ 25 января 2011

Можно использовать createTempFile, новый File (tmpDir, UUID.randomUUID (). ToString ()) тоже может подойти. Просто не используйте deleteOnExit () , это мастер утечки. Убедитесь, что вы удалили файл самостоятельно.

Редактировать: поскольку у вас будут данные в памяти, не храните их нигде; оберните java.io.ByteArrayInputSteam и используйте метод с InputStream. Намного аккуратнее и лучшее решение.

...