2009-11-18 2 views
0

Я пытаюсь сжать и архивировать все файлы в папке с использованием класса Java Runtime. Мой фрагмент кода выглядит следующим образом:Сжатие и архивирование файлов в папке с использованием 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

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

" marketData*" 

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

  • нумеруют файлы в архиве самостоятельно
  • запустить оболочку для выполнения команды («/ бен/ш -с»)
  • начала дегтя на папке, содержащие файлы архивировать

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

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

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

+0

Спасибо rsp. Но папка содержит много других типов файлов, и мне нужно архивировать только файлы, начинающиеся с marketData. Кроме того, файлы удаляются FTP в этой папке, а количество файлов меняется. Таким образом, кажется трудным использовать 1-й или 3-й метод, указанный вами. Я попробую со вторым. Не могли бы вы подробнее рассказать об этом. Спасибо, – Amit

+0

Это сработало Спасибо – Amit

1

(не ответ на ваш вопрос, скорее рекомендательный) Почему бы не попробовать this вместо этого.

+0

По двум основным причинам я не пробовал вышеуказанное: 1. Сжатие лучше в формате bz2. Мне нужно сжать файлы только один раз в день. 2. Мне нужно удалить файлы, которые были заархивированы, всего за один снимок. – Amit

1

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

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