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

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

04.12.2019, 23:16. Показов 1881. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru