Копирование растущего файла в Java - PullRequest
2 голосов
/ 16 ноября 2011

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

  1. Файл загружен с HTTP-сервера.
  2. Я инициирую копирование файла до окончания загрузки файла
  3. Копирование начинается и не заканчивается, пока файл не будет полностью загружен и все не будет скопировано

Я использовал следующий код:

 InputStream is = new FileInputStream(sourceFile);
 OutputStream os = new FileOutputStream(targetFile);

 byte[] buf = new byte[8192]; 
 int num;
 while ((num = is.read(buf)) != -1) {
     os.write(buf, 0, num);
 }

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

Я также протестировал использование BufferedInputStream и BufferedOutputStream, но это тоже не сработало.

Есть ли способ достичь того, чего я хочу?

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

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

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

Если вы не контролируете загрузкупроцесс, и это простая загрузка HTTP, вы можете заменить его чем-то, что вы делаете под контролем.

2 голосов
/ 16 ноября 2011

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

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

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