Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Linux и командная строка


Автор: zss 16.2.2006, 09:02
под Linux есть приложение, которое работает через командную строку.

Команды и результаты выводятся на консоль.
Нужно создать графическое приложение, которое может выдавать команды на консоль и читать с нее результаты.

Можно ли это сделать ? Если да, то как ?

Автор: Alexandr87 16.2.2006, 11:23
Можно.
Код

Process p=Runtime.getRuntime().exec("/bin/myprogram");
InputStream os=p.getInputStream();
InputStream es=p.getErrorStream()
OuputStream is=p.getOutputStream()

Ps. Не совсем понятно - "на консоль". Этот пример, читает стандартные потоки программы. Скорее всего так и будет работать, если он не использует файл консольного устройства.

Автор: LSD 16.2.2006, 14:01
Для начала, прочти FAQ http://vingrad.ru/JAVA-JAV-000121 и http://vingrad.ru/JAVA-JAV-002924.

Автор: zss 16.2.2006, 15:06
LSD, мне нужно немного не то


я в Linux полный валенок smile

если из командной строки, то нужно инициализировать hci

тоесть
Код

hciconfig ...
hci scan...


и в ответ на консоль вываливается список устройств

так вот мне надо этот результат получить из графического приложения

тоесть перенаправить вывод не на консоль а в свой поток
или может еще как


Автор: Alexandr87 16.2.2006, 16:41
То, что я предложил пробовал?

Автор: LSD 16.2.2006, 17:16
Цитата(zss @ 16.2.2006, 15:06)
если из командной строки, то нужно инициализировать hci

тоесть
Код

hciconfig ...
hci scan...


и в ответ на консоль вываливается список устройств

так вот мне надо этот результат получить из графического приложения

тоесть перенаправить вывод не на консоль а в свой поток
или может еще как

Так Alexandr87 тебе предложил: получаешь поток ввода приложения и поток вывода. Чтобы выполнить hci scan пишешь в поток вывода строку hci scan и читаешь затем из потока вывода список устройств.

Если не разберешься сам, напиши и я в выходные накидаю примерчик.

Автор: zss 16.2.2006, 18:03
спасибо всем - попробую

проблемма в том, что я не знаю что такое hci в Linux (поэтому и вопрос)

а если он автоматически запускается при старте системы ?


LCD - буду очень признателен, если набросаешь smile

Автор: LSD 16.2.2006, 18:06
Цитата(zss @ 16.2.2006, 18:03 Найти цитируемый пост)
проблемма в том, что я не знаю что такое hci в Linux (поэтому и вопрос)

а если он автоматически запускается при старте системы ?

Если проблема в hci, то это не сюда, это к линуксоидам в раздел. Я например тоже не знаю, что такое hci.

Автор: zss 17.2.2006, 09:34
LSD, все равно надеюсь на примерчик smile

а с hci - буду разбираться

Автор: zss 19.2.2006, 16:44
я так понимаю что мне достаточно послать команду просто на
системную консоль, а не для конкретного процесса

Как это можно сделать ?

Автор: zss 19.2.2006, 20:31
Alexandr87, кстати ты получаешь InputStream

а можно его сразу перенаправить например в JTextArea ?

Автор: LSD 19.2.2006, 21:38
Вот пример графической оболочки командного процессора:
Код
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class CmdTest extends JFrame
{
  private JTextArea textArea = new JTextArea(25, 80);
  private JTextField textField = new JTextField();
  private String newLine = System.getProperty("line.separator");
  private BufferedWriter writer;

  public CmdTest() throws IOException
  {
    super("Command processor");
    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec("cmd.exe");
    writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream(), "Cp866"));
    Streamer streamer = new Streamer(new InputStreamReader(process.getInputStream(), "Cp866"));
    streamer.start();
    streamer = new Streamer(new InputStreamReader(process.getErrorStream(), "Cp866"));
    streamer.start();

    textField.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        execCommand(textField.getText());
        textField.setText("");
      }
    });
    getContentPane().add(new JScrollPane(textArea), BorderLayout.CENTER);
    getContentPane().add(textField, BorderLayout.SOUTH);
    pack();
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
  }

  private void execCommand(String command)
  {
    try
    {
      writer.write(command);
      writer.write(newLine);
      writer.flush();
    }
    catch(IOException e)
    {
      e.printStackTrace();
    }
  }

  public static void main(String[] args)
  {
    try
    {
      CmdTest cmdTest = new CmdTest();
      cmdTest.setVisible(true);
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
  }

  private class Streamer extends Thread
  {
    private Reader reader;

    public Streamer(Reader reader)
    {
      super("Streamer");
      this.reader = reader;
    }

    public void run()
    {
      try
      {
        char[] buffer = new char[1024];
        int read;
        while((read = reader.read(buffer)) != -1)
        {
          textArea.append(new String(buffer, 0, read));
          textArea.setCaretPosition(textArea.getDocument().getLength());
        }
      }
      catch(IOException e)
      {
        e.printStackTrace();
      }
    }
  }
}

Автор: zss 19.2.2006, 23:12
LSD, большое спасибо

Автор: zss 24.2.2006, 21:25
LSD, скажи пожалуйста, а можно выводить InputStreamReader только когда это нужно, а не всегда.

З.Ы. И еще как быстро разобрать InputStreamReader, мне нужно получить
определенные поля. У меня по команде выводится

Scanning ...
00:11:22:33:44:55 n/a
...

Автор: LSD 24.2.2006, 23:35
Цитата(zss @ 24.2.2006, 21:25 Найти цитируемый пост)
а можно выводить InputStreamReader только когда это нужно, а не всегда

Можно, только вопрос когда нужно, а когда нет.

Цитата(zss @ 24.2.2006, 21:25 Найти цитируемый пост)
З.Ы. И еще как быстро разобрать InputStreamReader, мне нужно получить
определенные поля. У меня по команде выводится

java.util.regex

Автор: zss 25.2.2006, 00:39
Цитата(LSD @ 24.2.2006, 23:35 Найти цитируемый пост)
Можно, только вопрос когда нужно, а когда нет

мне для одной команды надо выводить, а для другой нет.

команды вводятся при нажатии кнопки

Автор: zss 25.2.2006, 20:18
в общем - почти все получилось

только осталось еще одно - как сэмитировать нажатие Ctrl+C в BufferWriter ?

Автор: LSD 26.2.2006, 11:04
Просто записать ^C не помогает?

Автор: zss 26.2.2006, 12:15
Цитата(LSD @ 26.2.2006, 11:04 Найти цитируемый пост)
Просто записать ^C не помогает?


не помогает smile

и это тоже не помогает
Код

writer.write (InputEvent.CTRL_DOWN_MASK | KeyEvent.VK_C);


Автор: Alexandr87 26.2.2006, 16:18
а после всего этого writer.flush() вызвать - не помогает?

Автор: LSD 26.2.2006, 20:12
В принципе процесс можно завершить Process.destroy(), но это будет не нормальное завершение, а экстренное как kill.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)