Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,398
Записей в блоге: 2

Передать команду работающему процессу через Apache commons exec

04.12.2019, 23:16. Показов 1905. Ответов 1

Студворк — интернет-сервис помощи студентам
Имеется программа с гуи на свинге, которая запускает в параллельном потоке другую программу, вывод той программы перенаправляю в System.out. Теперь возникла необходимость отправить команду во время ее работы. Никто не подскажет как это сделать?
Моя неработающая версия
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import javax.swing.JButton;
import javax.swing.JFrame;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecuteResultHandler;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.PumpStreamHandler;
 
public class Start {
    private OutputStream os = new ByteArrayOutputStream();
    public static void main(String[] args) {
        new Start();
    }
    DefaultExecutor executor;
    CommandLine cmdLine;
    PumpStreamHandler ps;
 
    Start() {
        Thread run = new Thread(launch);
        run.run();
        Thread rg = new Thread(gui);
        rg.run();
    }
    private Runnable launch = () -> {
        String args = "";
        cmdLine = CommandLine.parse(args);
        executor = new DefaultExecutor();
        executor.setExitValue(1);
        ps = new PumpStreamHandler(System.out);
        ps.setProcessInputStream(os);
        executor.setStreamHandler(ps);
        try {
            executor.execute(cmdLine, new DefaultExecuteResultHandler());
        } catch (IOException e) {
            e.printStackTrace();
        }
    };
    
    private Runnable gui = () -> {
        JFrame frm = new JFrame();
        frm.setSize(100, 100);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton btn = new JButton("stop");
        btn.setSize(100, 50);
        btn.addActionListener(a -> stop());
        frm.add(btn);
        frm.pack();
        frm.setVisible(true);
    };
 
    private void stop() {
        System.out.println("Stop button\n");
        try {
            Writer writer = new OutputStreamWriter(os);
            writer.write("stop\n");
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Такое ощущение что ps.setProcessInputStream(os); совсем не работает. Запускаемая программа в ходе своей работы может принимать сторонние команды, например stop для завершения. Если сделать так
Java
1
ps = new PumpStreamHandler(System.out, System.out, System.in);
то программа реагирует на ввод в консоль, а вот на кнопку из гуи ноль реакции (за исключением вывода в консоль моей надписи, значит кнопка работает, но без нужного результата).
Программка эта тестовая, так что прошу не кидаться тапками за вид, сейчас мне важнее понять как получить работоспособный вариант, а потом буду приводить к нормальному виду.
Ошибок никаких нету, просто дочерняя программа работает как ни в чем не бывало. Просто завершить процесс не вариант, так как потеряются данные, надо передать этот stop.
Думаю простейшая модель дочерней программы будет простейшая программа с циклом while true в режиме ввода с консоли и выходу из цикла по вводу stop.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2019, 23:16
Ответы с готовыми решениями:

Доступ к процессу, запускаемому через команду из ViewModel
В ViewModel.cs некоторый метод привязан к команде private RelayCommand _createRequestCommand; public ICommand CreateRequestCommand ...

Apache commons net
скачал плагин для сетей отсюда http://commons.apache.org/proper/commons-net/download_net.cgi commons-net-1.4.1.zip...

Apache commons net Ftp в android
Пишу программу для вывода названий файлов и директорий , на java никаких проблем не возникло, создал отдельный класс с новым потоком и там...

1
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
05.12.2019, 09:09
Мой совет - использовать Process.

Так-то, заставить его работать как нужно, получилось только переписав действия самого Handler.

--
исходя из документации, не нужно создавать никаких потоков на выполнения процесса

--
уверен, решение есть (силами самой библиотеки), но никто в сети об этом не знает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.12.2019, 09:09
Помогаю со студенческими работами здесь

Где находится org.apache.commons.io.FileUtils?
С данным языком программирования, как и с андроид студио раньше не имел никакого опыта, в виду обстоятельств потихоньку учу язык и для...

FTP клиент с использованием org.apache.commons.net
Всем добрый день. Необходимо выгружать фотографии на FTP сервер. Изучив тему полнял что нужно использовать библиотеку Apache commons. ...

Можно ли через именованный канал передать другому процессу такие типы данных как структуры, массивы?
У меня вопрос. Можно через именованный канал передать другому процессу такие типы данных как структуры, массивы и т.п. Если да, то как? ...

Gnu.io и org.apache.commons для проекта Android Studio
Здравствуйте! Помогите, пожалуйста, новичку в программировании под Android! Второй день бьюсь над проблемой. Пытаюсь построить готовый...

Послать команду запущенному приложению (процессу)
Существует возможность послать команду запасающемуся приложению из командной строки типа: "C:\PO.exe" /UDALIT. Как послать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru