Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов arj архиватора из Java, проблема с waitFor() 
V
    Опции темы
fclmfan
Дата 9.10.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Werdum face
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 64
Регистрация: 21.10.2008

Репутация: нет
Всего: нет



Здравствуйте! Архивирую файл с помощью ARJ из Java...
Код

public class Main {

    public static void main(String[] args) {
        Runtime r = Runtime.getRuntime();
        Process p = null;
        try {
            p = r.exec("arj.exe a -e a.arj a.txt");
            System.out.println(p.waitFor());
        } catch (Exception e) {
            System.out.println("Error!!!");
        }
        System.out.println("ARJ returned " + p.exitValue());
    }
}

Вот сам ARJ.EXE

Если архивирую совсем маленькие файлы, то работает нормально, а если допустим 1Мб, то программа "зависает" на p.waitFor(), хотя сам файл благополучно архивируется. Если не использую waitFor(), то работает без проблем. Но мне надо именно дождаться, когда будет готов архив... Подскажите, как исправить или обойти проблему?
P.S. сам ARJ работает исправно, если запускать вручную.
PM   Вверх
Skynin
Дата 9.10.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 6
Всего: 10



Цитата

а если допустим 1Мб, то программа "зависает" на p.waitFor(), ... Но мне надо именно дождаться,

Она то и делает - дожидается когда будет закончена работа. "Дожидается" и "зависла" в отношении потока выполнения программы - считайте одно и тоже. 
Process . waitFor() 
           causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.

Определитесь: вам чтобы ждала или не ждала?

Это сообщение отредактировал(а) Skynin - 9.10.2011, 15:11
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
fclmfan
Дата 9.10.2011, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Werdum face
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 64
Регистрация: 21.10.2008

Репутация: нет
Всего: нет



Цитата(Skynin @  9.10.2011,  15:06 Найти цитируемый пост)
Определитесь: вам чтобы ждала или не ждала?

Цитата(fclmfan @  9.10.2011,  13:47 Найти цитируемый пост)
Но мне надо именно дождаться, когда будет готов архив...

Цитата(Skynin @  9.10.2011,  15:06 Найти цитируемый пост)
"Дожидается" и "зависла" в отношении потока выполнения программы - считайте одно и тоже.

В моём случае она уже не "дожидается", а просто "зависает" на файлах бОльшего размера. Я пробовал ждать и по несколько минут, она не отлипается сама собой. Хотя если архивировать не через джаву, а просто через консоль, на 1Мбайтный файл уходит пару секунд максимум. Так что повторюсь, программа не "дожидается", а "зависает". При чём, как я уже сказал, сам архив "a.arj" появляется не диске физичеки, но программа не завершает работу.

PM   Вверх
Skynin
Дата 9.10.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 6
Всего: 10



Цитата

Так что повторюсь, программа не "дожидается", а "зависает".

То есть проблема на уровне взаимодействия JVM и ОСи, или ОСи и arj.exe - о завершении внешнего процесса, в каких-то ситуациях (файлы больше ...) не сообщается в точку waitFor()
Программа все ждет и ждет.

Можно посоветовать либо почитать и сделать как в 
ссылка 1
ссылка 2
в надежде что есть какой-то тонкий нюанс, - "нельзя запускать без перехвата ввода-вывода и/или из потока main"

или заменить:
версию JVM, версию ОСи, версию arj.exe

Цитата

В моём случае она уже не "дожидается", а просто "зависает"

Когда я обнаруживаю место затыка в программе - у меня слово "зависает" исчезает.
Зависание - это когда не знаешь по какой причине программа застопорилась - ждет и ждет ввода (получения управления) или в бесконечный цикл вошла.

PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
dobrolub
Дата 10.10.2011, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



arj пытается писать в out и err, поэтому тебе надо их читать.

Читать их надо в отдельном Thread, после того как процесс стартовал.

Код

Process p = r.exec("your arj command");

final InputStream in = p.getInputStream();
final InputStream err = p.getErrorStream();

new Thread() {
  public void run() {
    try {
      while (in.read() > 0);
    } catch (Exception e) {
       e.printStackTrace();
    }
  }
}.start();

new Thread() {
  public void run() {
    try {
      while (err.read() > 0);
    } catch (Exception e) {
       e.printStackTrace();
    }
  }
}.start();

p.waitFor();


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

Думаю, что архивация мелких файлов не вызывает переполнения буффера, а архивация больших - вызывает.



Это сообщение отредактировал(а) dobrolub - 10.10.2011, 05:52
PM   Вверх
fclmfan
Дата 10.10.2011, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Werdum face
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 64
Регистрация: 21.10.2008

Репутация: нет
Всего: нет



dobrolub, спасибо! Ваш способ помог! И Skynin, тоже спасибо за помощь.
PM   Вверх
math64
Дата 10.10.2011, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно запускать через .bat файл
Код

arj.exe a -e a.arj a.txt >/a.log

и вывод попадёт в файл и его можно не читать или прочитать позже.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.