Выполнить команду из Java и НЕ ждать результата

Я создаю строку командной строки в своем приложении Java (например, «winword.exe FinalReport.doc»). Я хочу выполнить команду и отпустить ее: я не хочу/нужно ждать результата (максимум будет: правильно ли она запустилась, но это необязательно), и приложение должно продолжать работу, когда мое приложение Java завершено .

Я посмотрел на Runtime.getRuntime().exec() и Apache Commons_Exec. Оба контролируют запущенное приложение (с общими и обратным вызовом явно предпочтительнее), но это не то, что мне нужно. Что мне не хватает?

Нужно ли вызывать Windows/Linux/Mac API для запуска независимого приложения?


person stwissel    schedule 10.08.2011    source источник
comment
Вы пробовали запустить start winword.exe FinalReport.doc? start запускает winword и возвращается, не дожидаясь выхода.   -  person Jacob    schedule 10.08.2011


Ответы (2)


Существует простой кросс-платформенный способ сделать это, используя java.awt.Desktop API, например:

File file = new File("FinalReport.doc");
java.awt.Desktop.getDesktop().edit(file);

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

person Nathan Hughes    schedule 10.08.2011
comment
Я посмотрел на это. У меня почти сработало :-). Мои файлы находятся на удаленном сервере webDAV, а в Windows вызов редактирования сначала просматривает протокол (https://) и запускает браузер вместо Winword. Знаете ли вы, может ли Desktop запросить имя исполняемого файла? - person stwissel; 12.08.2011
comment
@stwissel: я думаю, я бы написал код, чтобы скопировать файл по URL-адресу во временный каталог и открыть файл оттуда. Но нет, API рабочего стола не говорит, что он будет использовать для открытия чего-либо. - person Nathan Hughes; 12.08.2011
comment
Спасибо за объяснение. Думаю, было бы интересно либо взглянуть на исходники OpenJDK, чтобы увидеть, какие вызовы они делают, либо провести серьезную работу по размышлению. Кто-нибудь может добавить день к моей неделе? - person stwissel; 13.08.2011
comment
@stwissel: это повлечет за собой много копаний. если вас интересует решение для Windows, см. stackoverflow.com/questions/6273221/ - person Nathan Hughes; 13.08.2011
comment
@stwissel: след переходит в собственный код в docjar .com/html/api/sun/awt/windows/WDesktopPeer.java.html - person Nathan Hughes; 13.08.2011

попробуйте использовать процесс! вот как я использую его в своем приложении:

Process process = new ProcessBuilder()
                    .command(convert, image.name, "-thumbnail", "800x600>", bigsize.name)
                    .directory(image.parentFile)
                    .redirectErrorStream(true)
                    .start()

Я предполагаю, что вы можете использовать как:

Process process = new ProcessBuilder()
                    .command("winword.exe", "FinalReport.doc")
                    .directory(new File("C:/"))
                    .redirectErrorStream(true)
                    .start()
person Arthur Neves    schedule 10.08.2011
comment
Я попробую это. Действительно интересный вопрос: что произойдет, если Java завершится до закрытия Windword. - person stwissel; 12.08.2011
comment
насколько я знаю, когда вы запускаете processbuilder.start, он разветвляется на процесс! так что даже если вы закроете Java! Windword по-прежнему будет работать! - person Arthur Neves; 12.08.2011