2011-01-25 1 views
0

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

  • storeFile (String удаленного, InputStream локальная)
  • storeFileStream (String удаленный)

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

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

ответ

1

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

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

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

0

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

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

Смежные вопросы