Как получить пакетный вывод CMD непрерывно в Java-приложении - PullRequest
0 голосов
/ 16 мая 2018

Я написал программу, которая запускает пакетную команду (tshark) для захвата размера пакета между 2 ip-адресами (непрерывно).

Я использовал Runtime и Process для его запуска и process.getOutputStream()чтобы получить возвращенные значения и распечатать их в терминале Java.

Моя проблема заключается в том, что печать делает паузы между двумя записями (печать 1200 строк / остановка 10 секунд / печать 1200 строк).

Вы знаете способ непрерывного чтения в приложении Java OutputStream пакетной команды?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Это именно мой код. Команда Ping быстро заканчивается, поэтому, если я подожду несколько секунд, у меня будет результат. Tshark захватывает сеть, поэтому не заканчивается.

Моя проблема в том, что чтение делает паузы.

Это мой код:

    String cmd = "c:\\\"Program Files\"\\Wireshark\\tshark.exe -T fields -e frame.len host"+ ipSrc +" and dst "+ ipDst;

    String[] command = {"cmd.exe", "/C", cmd};

    try {
        final Process proc = Runtime.getRuntime().exec(command);
        try {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(proc.getInputStream()));
            String line = "";
            try {
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            } finally {
                reader.close();
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Я также пытался использовать поток для записи в терминале, но это та же проблема:

    new Thread() {
            @Override
            public void run() {
                try {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(
                                    process.getInputStream()));
                    String line = "";
                    try {
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);
                        }
                    } finally {
                        reader.close();
                    }
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }.start();
0 голосов
/ 16 мая 2018

Прежде всего вы хотите прочитать InputStream: вы читаете из и InputStream, вы пишете в и OutputStream. Посмотреть это сообщение

Затем используйте BufferReader, чтобы обернуть ваш OutputStream и читать его построчно в цикле while.

Вы также можете поймать ошибку InputStream. Это может быть полезно для отладки, если вы не видите вывод.

Вот пример с командой ping. Поскольку я не знаю, какова ваша команда tsharp.

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("ping www.google.com");

String line = null;

BufferedReader inputStreamReader = 
    new BufferedReader(new InputStreamReader(proc.getInputStream()));
while ((line = inputStreamReader.readLine()) != null) {
    System.out.println(line);
}

BufferedReader errorStreamReader = 
    new BufferedReader(new InputStreamReader(proc.getErrorStream()));
while ((line = errorStreamReader.readLine()) != null) {
    System.out.println(line);
}
...