Добрый день. Помогите новичку...
Пытаюсь парсить вывод утилиты 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
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;
}
Комментариев нет:
Отправить комментарий