| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > getRuntime().exec и потоки |
| Автор: Demetrio 1.5.2007, 09:46 | ||
| Новичок в java далее Как правильно обеспечить удерживание процесса(или сессии)? На данный момент делаю так, но ... 1. Второй раз вызов метода get_info ничего не вовзращает..... где накосячил? 2. Как мне очистить OutPutStream , так как мой mytelnet при старте выдает служебную информацию.... p.s. Конечно mytelnet не telnet никакой... просто консольная клиентская утилитка. Можно в ней затык.
|
| Автор: Demetrio 1.5.2007, 16:38 | ||
| Без закрытия close ничего не выводит вовсе.... может еще как надо подкрректировать... НЕмного модернизировал под ProcessBuilder, но сути это не меняет... Если у кого есть пример, как посылать команды открытому процессу по мере необходимости, не вызывая ProcessBuilder каждый раз, то с радостью воспользуюсь.... Еще раз повторюсь первый вызов метода get_info проходит на ура
|
| Автор: powerOn 1.5.2007, 16:48 |
| Модератор: Используйте кнопку КОД для оформления исходников! |
| Автор: LSD 1.5.2007, 17:37 | ||
Используй вместо close() - flush(). |
| Автор: Demetrio 2.5.2007, 09:26 |
| нет, данный вариант тоже не проходит |
| Автор: LSD 3.5.2007, 11:08 | ||
|
| Автор: Akeem 13.2.2008, 11:05 |
| Вопрос по классу CmdTest. Как можно переписать этот класс так чтобы результаты выводились не на консоль, а в в стринг. Или плиз покажите строчку где выводятся результаты работы команды. Сорри. Смотрю я на класс и не вижу где эти результаты выводятся. :-[ |
| Автор: Sardar 13.2.2008, 12:32 |
| Spooler перегоняет данные из input- в output-stream, тредом висит, блокируется по in.read(). Пока есть данные в потоке тред разблокирован, зачитывает их в переданный output-stream (81-82). Рядом с out.write поставь StringBuilder.append(buffer, 0, read). Если необходимо, то по in.available() > 0 можно определить заблокируемся ли на следующей итерации. |
| Автор: Akeem 13.2.2008, 12:53 | ||
| прописал строку StringBuilder.append(buffer, 0, read) перед out.write. И еклипс начал ругатся на buffer Пишет что нужно чтобы он был CharSequence А если использовать замисть переганяния StringBufferInputStream он вроде сражу должен возвращать нужный стринг. Добавлено через 10 минут и 30 секунд Решил проблему.
Теперь у меня возник вопрос такой. Возможен ли вывод каждого выполнения команды отдельно. Например выполнил одну команду вывел её результат. И как это сделать? П.С. Последовательный вывод возможен для одной консоли. |
| Автор: LSD 13.2.2008, 13:23 | ||||||
Вместо:
пиши:
а когда хочешь получить строку:
|
| Автор: Akeem 13.2.2008, 13:37 | ||
Куда мне это добавить? В функцию exec? П.С. Я добавил ее в эту функцию. но мне после выполнения команды например: test.exec("C:"); test.exec("CD"); выдает [] |
| Автор: LSD 13.2.2008, 13:42 |
Туда где тебе надо получить результат выполнения команды. |
| Автор: Akeem 13.2.2008, 13:52 | ||||
Вот написал метод для вывода результатов
Результат выполнения команд
Остается плачевным -- те выводит пустую консоль. Замисть того чтобы вывести C:\ Добавлено через 2 минуты и 11 секунд П.С. Сорри за тупые вопросы. Чет туплю седня. |
| Автор: Akeem 13.2.2008, 14:17 | ||||||
| Вот как нужно выводить результат каждой команды: Функция для перехвата вывода:
(генетически модифицированая функция написаная ЛСД (спасибо ему за это огромное) Функция вывода:
Вызов:
Единственный минус не понятно каким Р оно работает. Те при дебаге все работает как нужно, но при обычном выполнении ничего не выводится. |
| Автор: LSD 13.2.2008, 14:44 | ||
Проблема состоит в том, что CmdTest.exec() не ждет пока будет выполнена команда. Команда просто передаётся cmd.exe и все. Сколько она будет выполняться - неизвестно. С выводом в System.out таких проблем нет, потому что по мере выполнения команды данные перекачиваются в System.out, а тут ты сам должен определить когда команда выполнилась, или просто подождать.
|
| Автор: Akeem 13.2.2008, 15:15 |
| LSD, спасибо! Все работает. Премного благодарен. Только вопрос: обезательно указывать кодировку? спрашиваю потому що если указать явно то выдает ошибку что неопознает кодировки. (мне не нужны лишние параметры) П.С. Код переписал под свою программу. |
| Автор: LSD 13.2.2008, 15:22 | ||
У меня без указания кодировки не все работает корректно, вместо русских буквы кракозябры. Можешь переписать так:
тогда никаких Exception-ов выкидываться не будет. Добавлено через 37 секунд К тому же часть команд выводит данные в 866 кодировке, часть в 1251. |
| Автор: Akeem 13.2.2008, 15:26 | ||
| Ну в принципе у меня проблем с кодировкой не должно быть. Все результаты и команды на англ. П.С. Я вообще убрал объявление кодировки с функции.
|
| Автор: Resilient 27.11.2008, 18:21 |
| Приветствую... вобщем-то тоже чайник в Яве, надеюсь, что только пока что А нету ли способа гарантированно дождаться выполнения команды? и узнать, что вернула та програмка. |
| Автор: LSD 29.11.2008, 15:37 | ||
А нафига? Если тебе нужно выполнить некую программу, то вызывай непосредственно её, а не через cmd.exe и таких проблем не будет. А если тебе нужно выполнить команду именно cmd.exe, то в любом случае ты будешь парсить вывод этой команды и по нему уже можно будет определить, что команда завершена. |
| Автор: Resilient 1.12.2008, 16:52 |
| В данном случае неизвестно других методов вызова, кроме как из командной строки :( Нужно же дождаться окончания выполнения и в зависимости от кода возврата в cmd продолжить. |
| Автор: LSD 1.12.2008, 18:23 | ||
Вызова чего? Ты программу пытаешься вызвать или внутреннюю команду cmd.exe? |
| Автор: Resilient 2.12.2008, 15:11 |
| программу. И другого вызова в данном случае не получится. НО у меня оно дожидается окончания работы. |
| Автор: LSD 2.12.2008, 17:33 |
Ну так и запускай программу, а не cmd.exe |