Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Вывод runtime на русском в java

Добрый день. Помогите новичку... Пытаюсь парсить вывод утилиты Windows ping или tracert из java. Windows русскоязычная. Проверял вывод в консоль и в файл. Вместо русских букв - знаки вопроса. Подозреваю, что дело в кодировке, но как решить эту проблему не пойму. Направьте в правильную сторону, плз. Почему так получается?
Process p; String command = "ping 8.8.8.8"; try { int coutn =0; p = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); p.waitFor(); String line; while ((line = reader.readLine()) != null) { if(line.startsWith("Ответ от")) { coutn++; } } System.out.println(coutn);
} catch (Exception ex) {ex.printStackTrace();}


Ответ

Спасибо всем за помощь.
Оказалось нужно указывать кодировку так, что бы поток шел уже в нужной кодировке. Такой кодировкой оказалась в windows "Cp866".
Метод с одним пингом и кодом ошибки я пробовал. Работает не корректно, если я проверяю недоступный хост в той же сети. В таком случае этот способ даёт код ошибки "1". Как будто хост доступен. Для проверки шлюза даст не правильный результат. Можно, правда, добавить проверку на наличие поля TTL в ответе пинга. Тогда оно работает правильно. Тестировал как то так:
Process p; String command = "ping -n 1 192.168.0.55 | find \\\"TTL\\\"\"";
ArrayList list = new ArrayList(); try {
p = Runtime.getRuntime().exec(command); int exitValue = p.waitFor();
System.out.println(exitValue);
} catch (Exception ex) {ex.printStackTrace();}
В итоге для себя сделал следующим образом:
public static boolean ping(String ip) { int coutn =0; boolean reachable = false; try {
Process p; String command = "ping " + ip; p = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream(), "Cp866"));
p.waitFor(); String line; while ((line = reader.readLine()) != null) {
if(line.startsWith("Ответ от")) { coutn++; } } if (coutn ==4) { reachable=true; } else { reachable=false; } }
catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();} return reachable;
}

Комментариев нет:

Отправить комментарий