Сжатие и архивирование файлов в папке с использованием Java Runtime - PullRequest
0 голосов
/ 18 ноября 2009

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

public static void compressFileRuntime() throws IOException, InterruptedException {

    String date = Util.getDateAsString("yyyy-MM-dd");
    Runtime rt = Runtime.getRuntime();
    String archivedFile = "myuserData"+date+".tar.bz2";
    String command = "tar --remove-files -cjvf "+archivedFile+" marketData*";
    File f = new File("/home/amit/Documents/");
    Process pr = rt.exec(command, null, f);
    System.out.println("Exit value: "+pr.exitValue());
}

Приведенный выше код не архивирует и не сжимает файл, как ожидалось, хотя он создает файл myuserData2009-11-18.tar.bz2 в папке "/home/amit/Documents/".

Также вывод

Exit value: 2.   

Хотя если я выполню ту же команду из командной строки, она даст ожидаемый результат.

Пожалуйста, скажите мне, что мне не хватает.

Спасибо
Amit

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Проблема заключается в этой части:

" marketData*"

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

  • Пронумеруйте файлы для архивации
  • запустить оболочку для выполнения команды ("/ bin / sh -c")
  • запустить tar в папке, содержащей файлы для архивации

Редактировать * * 1016: Для параметра оболочки ваша команда будет выглядеть так:

String command = "sh -c \"tar --remove-files -cjvf "+archivedFile+" marketData*\"";

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

1 голос
/ 18 ноября 2009

Если вы действительно хотите создать архив bzip2, я бы использовал реализацию Java вместо собственной команды, которая хороша для переносимости, например, доступной в http://www.kohsuke.org/bzip2/ (хотя она не очень оптимизирована сжатие кажется медленнее, чем в Java LZMA).

...