Требуется порт Windows - PullRequest
       1

Требуется порт Windows

0 голосов
/ 16 июля 2010

Я пытаюсь перенести часть кода, написанного на Java (см. Ниже), с Linux на Windows и нанести удар по точке.

                String sh = "/bin/sh";
                String cop = "-c";
                String cmd = "netstat -a | grep 9000 | wc -l";
                String[] exe = new String[] {sh, cop, cmd};
                Process FindConns = Runtime.getRuntime().exec(exe);

Это фактически создает команду и передает еев оболочку для выполнения и получения результата.
Теперь в Windows эквивалентная команда будет

netstat -a | find /c "9000"

Однако я не уверен насчет следующего: -

  • Для порта Windows, какую командную строку следует передать в Runtime.getRuntime (). Exec ().Я пытался с

    String cmd = "netstat -a | find / c 9000";
    // и String cmd = "netstat -a | find / c \" 9000 \ "";Процесс FindConns = Runtime.getRuntime (). Exec (cmd);

Но не удается.Кажется, при отладке, что Windows портится при |(труба) персонажа.Поскольку следующее работает нормально.

String cmd = "netstat -a";
Process FindConns = Runtime.getRuntime().exec(cmd);
  • Во-вторых, (будучи новичком в Java-программировании), каков наилучший способ выполнения условной компиляции, такой как #ifdef WIN32 и т. Д. В Java.

    Спасибо.

Ответы [ 2 ]

1 голос
/ 16 июля 2010

В качестве отдельного ответа: эквивалент условной компиляции в Java.

(Возможно, для вас было бы лучше задать это как отдельный вопрос).

Как вы, вероятно, знаете,В Java на самом деле нет условной компиляции, конечно, не в смысле препроцессора C.


В некоторых случаях достаточно просто поместить каждую альтернативу кодирования в блок if, управляемый константами, ошибаться, static final полей.Если эти поля можно оценить во время компиляции, чтобы их значения были эффективными константами, то компилятор достаточно умен, чтобы полностью удалить код из if блоков, которыми он управляет.Однако код внутри этих блоков все еще компилируется (в отличие от препроцессора) и подвергается проверке синтаксиса.Иногда меня раздражает, что #import, используемые кодом с закомментированными константами, объявляются (в моей Eclipse IDE) неиспользуемыми, но если я пропущу #import, тогда мое кодирование будет неправильным, если я изменю константы.

Обратите внимание, что эта «константа» может быть определена в отдельном классе, поэтому изменение вашей «конфигурации» может быть достигнуто путем изменения значения в одном файле.


Ещевысокоуровневый ответ на ваш вопрос включает в себя настройку во время выполнения, внедрение зависимостей и тому подобное.Основная идея состоит в том, чтобы ваш системно-зависимый код содержался в отдельных классах (по одному для каждой целевой системы), каждый из которых реализует один и тот же интерфейс (ы).

Во время выполнения приходит около двух разных механизмов.обратите внимание на выбор правильного кода:

  • Ваш код имеет поле, тип которого является типом общего интерфейса;при запуске ваша программа считывает имя соответствующего класса из файла конфигурации, создает экземпляр объекта этого класса с помощью Class.forName() или чего-то подобного, назначает этот объект полю и затем использует методы этого экземпляра для выполнения любой конфигурации.необходимо выполнить определенные действия.

  • Если вы развертываете свою программу в виде Jar файлов, вы можете создать отдельные файлы Jar, содержащие по одному каждому из ваших классов, зависящих от конфигурации, и когдавы развертываете свою программу, вы развертываете "основной" файл jar и один файл jar с содержимым, зависящим от конфигурации.Затем, когда ваша программа запускается, она может искать в своем classpath любой из классов-кандидатов (возможно, путем проб и ошибок с Class.forName()), а затем она работает аналогично другому механизму.


РЕДАКТИРОВАТЬ

Думая об этом, я подумал о "мета-ответе дзен-буддизма":

В прожорливой безграничности памяти, занятой JavaПрограмма, зачем беспокоиться о нескольких байтах лишнего кода?Если вы действительно хотите кодировать только два альтернативных подхода к выполнению системно-зависимой команды, то проверяйте, кодируйте и компилируйте отдельные методы для каждого из них:

private void windowsProcess();
private void linuxProcess();

... и затем вызывайте тот, который подходит:

public void independentProcess() {
    if (runningOnWindows()) {
        windowsProcess();
    } else {
        linuxProcess();
    }
}

... и покончим с этим.

Отдельные банки, разрешение времени выполнения и т. Д. Являются решениями, нацеленными на обмен значительными частями механизма кода, возможно, целыми библиотеками ... еслиэто всего лишь несколько сотен строк или около того, я лично не стал бы беспокоиться о неиспользованном коде в моей программе.Это не похоже на Java - быть привередливым к небольшим или даже средним объемам памяти.Какая память у каждого объекта?16 байт?32

1 голос
/ 16 июля 2010

| фактически обрабатывается интерпретатором командной строки, и ни одна другая программа не знает, как это сделать.

Если вы хотите обработать командную строку (содержащую такие вещи, как перенаправление) в Windows, вы должны передать эту строку в качестве аргумента cmd /c. Я имел довольно хороший успех с этим в прошлом.

РЕДАКТИРОВАТЬ: (В случае, если это было менее, чем ясно)

exec () запускает программу, она явно не вызывает интерпретатор командной строки (cmd.exe) для этого.

Программа, которую вам нужно выполнить, - это cmd.exe, а все остальные вещи нужно передать ей в виде командной строки. Я не совсем уверен, если вам нужны аргументы в виде одной строки или они должны быть разделены ... попробуйте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...