Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск dos - программы в Java 
V
    Опции темы
Vitaly333
Дата 27.3.2009, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Можно ли как - нибудь из Java запустить dos-программу:

Такой код:
Код

Process process =  Runtime.getRuntime().exec("mydosprogram.exe");

Не работает. Файл находит, обрабатывает но не запускает. 

P.S.: ОС - Windows XP. 

PM MAIL   Вверх
PashaOvechkin
Дата 28.3.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 2
Всего: 4



либо укажи полный путь на ехе, либо, если етот ехе у тебя прописан в переменных окружения, указывай название запускаемого файла без расширения
Код

Process process =  Runtime.getRuntime().exec("mydosprogram");

PM MAIL Skype   Вверх
LSD
Дата 28.3.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Vitaly333 @  27.3.2009,  23:03 Найти цитируемый пост)
Не работает. Файл находит, обрабатывает но не запускает.

А как ты определяешь, что не запускает?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Vitaly333
Дата 28.3.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Цитата

либо укажи полный путь на ехе, либо, если етот ехе у тебя прописан в переменных окружения, указывай название запускаемого файла без расширения

Пробовал по разному и с относительным и с абсолютными путями. Всё равно не работет. Не в путях здесь дело, сам exe - шник он находит. 

Код

А как ты определяешь, что не запускает? 


Я для проверки пробовал запустить старый добрый dos-овский doom. Но никакого UI не появляется. Та же беда и с моим dos - овским приложением. Может быть нужно запускать через какой - нибудь dos эмулятор или в свойствах exe-шника чё нибудь нашаманить? 

Это сообщение отредактировал(а) Vitaly333 - 28.3.2009, 13:58
PM MAIL   Вверх
NeoNYura
Дата 28.3.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.3.2008

Репутация: нет
Всего: нет



Код

             String[] cmd={"cmd.exe","/r",arg};
             p = Runtime.getRuntime().exec(cmd);


Попробуй так, где arg="mydosprogram.exe"
PM MAIL   Вверх
Vitaly333
Дата 28.3.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



NeoNYura, не получается.
У меня даже командную строку так не запускает:
Код

Process process =  Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe");

PM MAIL   Вверх
NeoNYura
Дата 28.3.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.3.2008

Репутация: нет
Всего: нет



Возми потоки от Процесса, и посмотри что он пишет

Это сообщение отредактировал(а) NeoNYura - 28.3.2009, 14:17
PM MAIL   Вверх
Vitaly333
Дата 28.3.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Цитата

Возми потоки от Процесса, и посмотри что он пишет

Вы имеете ввиду stdin_stream и stdout_stream?
PM MAIL   Вверх
NeoNYura
Дата 28.3.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.3.2008

Репутация: нет
Всего: нет



Код

Process.getErrorStream())
Process.getOutStream())

PM MAIL   Вверх
Vitaly333
Дата 28.3.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Ничего не пишет
PM MAIL   Вверх
SoulKeeper
Дата 28.3.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



ExitCode хоть возвращает?
PM MAIL   Вверх
NeoNYura
Дата 28.3.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.3.2008

Репутация: нет
Всего: нет



Попробуй вызвать cmd.exe dir


если в Process.getOutStream())


не вернет список, значит проблема в программе, выкладывай ее сюда

Это сообщение отредактировал(а) NeoNYura - 28.3.2009, 15:55
PM MAIL   Вверх
Vitaly333
Дата 28.3.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Цитата

ExitCode хоть возвращает? 

Может exitValue или hachCode? ExitCode не нашел, а хэш возращает, более того я могу прочитать из входного потока следующие строки:

Код

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.


Значит cmd всё таки запускается, но почему то не отображается как отдельное консольное окошко.

Цитата

Попробуй вызвать cmd.exe dir
Process.getOutStream())


Читать нужно не из Process.getOutStream() а из Process.getInputStream()
Считыват текущую директорию нормально.













PM MAIL   Вверх
Vitaly333
Дата 6.6.2009, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Так как быть то??? Что никто не знает?
PM MAIL   Вверх
dorogoyIV
Дата 6.6.2009, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Код

  Runtime.getRuntime().exec("cmd /C D:/mydosprogram.exe");

так пробовал?
PM MAIL   Вверх
Vitaly333
Дата 6.6.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Цитата

так пробовал? 

Да, всё равно окно не появляется
PM MAIL   Вверх
dorogoyIV
Дата 6.6.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Цитата(Vitaly333 @  6.6.2009,  13:33 Найти цитируемый пост)
всё равно окно не появляется

изначально вообще то вопрос звучал подругому: "Можно ли как - нибудь из Java запустить dos-программу"
запустилась прога или нет?!
PM MAIL   Вверх
Vitaly333
Дата 7.6.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Цитата

изначально вообще то вопрос звучал подругому: "Можно ли как - нибудь из Java запустить dos-программу"
запустилась прога или нет?! 

Да судя по всему запускается но не выполяется должным образом! Не знаю почему!! Дело не в программе точно!!!
Программа должна читать текстовый файл , на основе своей логики обрабатывать его и создавать другой текстовый файл. Когда запускаю через cmd всё отлично работает. Когда запускаю через Java не работает!
PM MAIL   Вверх
LSD
Дата 8.6.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



1. Консольное окно и не должно появляться.
2. Почитай эту статью и учти, что надо читать оба потока и stdin, и stderr.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Vitaly333
Дата 17.6.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Цитата

Почитай эту статью и учти, что надо читать оба потока и stdin, и stderr. 


Сделал как в статье... Приложение виснет на чтении потоков.
Вот это консольное приложение с входным файлом, которое нужно запустить, чтобы оно нормально отработало и выплюнуло результат в выходной файл.
Кто запустит его из под Java - тому респект, уважуха и балл в репутации)



Это сообщение отредактировал(а) Vitaly333 - 17.6.2009, 14:25
PM MAIL   Вверх
LSD
Дата 18.6.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Все же элементарно решается:
Код

import java.io.File;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Test
{
  public static final String PROGRAMM = "C:\\TEMP\\PROGRAM.EXE";

  public static void main(String[] args) throws Exception
  {
    File workDir = new File(PROGRAMM).getParentFile();
    ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/C",PROGRAMM);
    processBuilder.directory(workDir);
    Process process = processBuilder.start();
    new Spooller(new InputStreamReader(process.getInputStream(), "Cp866"), new OutputStreamWriter(System.out, "Cp866")).spool();
    new Spooller(new InputStreamReader(process.getErrorStream(), "Cp866"), new OutputStreamWriter(System.err, "Cp866")).spool();
    int result = process.waitFor();
    System.out.println("Process finished. Exit code " + result);
  }
}

Код

import java.io.*;

public class Spooller implements Runnable
{
  private InputStream in;
  private OutputStream out;
  private Reader reader;
  private Writer writer;
  private Type type;
  private int bufferSize = 16 * 1024;

  public Spooller(InputStream in, OutputStream out)
  {
    if(in == null || out == null)
    {
      throw new NullPointerException();
    }

    this.in = in;
    this.out = out;
    type = Type.BINRY;
  }

  public Spooller(Reader reader, Writer writer)
  {
    if(reader == null || writer == null)
    {
      throw new NullPointerException();
    }

    this.reader = reader;
    this.writer = writer;
    type = Type.CHARACTER;
  }

  public int getBufferSize()
  {
    return bufferSize;
  }

  public void setBufferSize(int bufferSize)
  {
    this.bufferSize = bufferSize;
  }

  public Type getType()
  {
    return type;
  }

  public void run()
  {
    switch(type)
    {
      case BINRY:
        spoolBinary();
        break;

      case CHARACTER:
        spoolCharacter();
        break;
    }
  }

  private void spoolBinary()
  {
    try
    {
      byte[] buffer = new byte[bufferSize];
      int read;
      while((read = in.read(buffer)) != -1)
      {
        out.write(buffer, 0, read);
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    finally
    {
      close(in);
      close(out);
    }
  }

  public void spool()
  {
    Thread spoolThread = new Thread(this, "Spool thread");
    spoolThread.start();
  }

  private void spoolCharacter()
  {
    try
    {
      char[] buffer = new char[bufferSize];
      int read;
      while((read = reader.read(buffer)) != -1)
      {
        writer.write(buffer, 0, read);
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    finally
    {
      close(reader);
      close(writer);
    }
  }

  private static void close(Closeable closeable)
  {
    if(closeable != null)
    {
      try
      {
        closeable.close();
      }
      catch(Exception e)
      {
        //ignore
      }
    }
  }

  public static enum Type
  {
    BINRY,
    CHARACTER
  }
}

если будешь запускать под IDE то замени кодировку у OutputStreamWriter.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Vitaly333
Дата 19.6.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Ооо Круто. Спасибо вам, уважаемый LSD. +1 к вашей репутации, как и обещал. Я бы сам не сделал, так как ничего не знаю про ProcessBuilder, а с Runtime.getRuntime.exec() так и не получилось, ну и ладно.
Есть ещё один небольшой нюанс: приложение отказывается запускатся по относительному пути (пишет что такой путь не существует), хотя по этому самому же пути обычный текстовый файл IO - потоки читают без проблем.

PM MAIL   Вверх
LSD
Дата 22.6.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код

new File(PROGRAMM).getCanonicalPath()

Преобразует относительный путь в абсолютный.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Vitaly333
Дата 22.6.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Спасибо. А ещё можно так:

Код

new File(path).getAbsolutePath();

где, path - относительный путь

И у меня наконец таки получилось запустить это консольное приложение через Runtime:
Вот так:

Код

String path = new File("").getAbsolutePath() + File.separator + "tools";
String cmd[] = {"cmd.exe", "/C", "cd " + path + "&& start PROGRAM.exe"};
  try {
    Runtime.getRuntime().exec(cmd);
  } catch (IOException e) { }   

Запускает приложение PROGRAM.exe,  находящееся в папке tools. Единственный минус - относительный путь нужно жестко прописывать в методе.
Оказывается дело было всё таки в путях...
 

Это сообщение отредактировал(а) Vitaly333 - 22.6.2009, 19:34
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1253 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.