Java inputStreamReader Charset - PullRequest
       30

Java inputStreamReader Charset

5 голосов
/ 01 мая 2011

Я хочу пропинговать целевой IP-адрес и получить ответ.Чтобы достичь этого, я использую командную строку Windows в Java с методом runtime.exec и классом процесса.Я получаю ответ, используя inputStreamReader.

Моя кодировка по умолчанию - windows-1254, она турецкая.Когда я получаю его, ответ содержит турецкие символы, но турецкие символы не отображаются правильно в консоли.

Я хочу получить числовое значение из полученного ответа, но искомое значение содержит некоторый турецкий языксимволов, поэтому, когда я смотрю его, я не могу его найти.

Ниже приведены коды, и мне нужно знать, как сделать так, чтобы турецкие символы были видны здесь:

runtime = Runtime.getRuntime();
process = runtime.exec(pingCommand);

BufferedReader bReader = new BufferedReader(
        new InputStreamReader(process.getInputStream(), "UTF8"));

String inputLine;
while ((inputLine = bReader.readLine()) != null) {
    pingResult += inputLine;
}

bReader.close();
process.destroy();

System.out.println(pingResult);

Ответы [ 6 ]

6 голосов
/ 04 мая 2011

Чтобы это исправить, необходимо проверить кодировку, которую ваша текущая операционная система использует в командной строке, и получить данные, совместимые с этой кодировкой.

Я выяснил, что кодировка для командной строки Turkish XPCP857, и когда вы редактируете код, как показано ниже, проблема решается.

BufferedReader bReader = new BufferedReader(
        new InputStreamReader(process.getInputStream(), "CP857"));

Thx за вашу помощь.

Примечание.команда.

2 голосов
/ 01 мая 2011

Вы говорите, что символы извлекаются правильно, но System.out не печатает их правильно? System.out, безусловно, старый класс. Может быть, попробуйте

PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out,"charactersethere"));
out.println(“encoded system”);
out.flush();
out.close();

Это МОЖЕТ работать

2 голосов
/ 01 мая 2011

Если вам просто нужно пропинговать и получить время отклика, то чтение вывода с консоли может оказаться излишним. Существует более простой способ, если вы используете Java5 или новее:

Вот полная программа, которую вы можете использовать для этого. ПРИМЕЧАНИЕ. В Unix / Linux / Mac OS вы должны запустить эту программу под «sudo», чтобы получить ответ от чего-либо, кроме «localhost».

import java.net.InetAddress;
import java.io.IOException;

class PingTest {

  public static void main(String[] args) {
    try {
      String hostnameOrIP = args[0];
      int timeout = Integer.parseInt(args[1]);
      int pingCount = Integer.parseInt(args[2]);

      System.out.println("Pinging '" + hostnameOrIP + "'");
      for (int i = 0; i < pingCount; i++) {
        System.out.println("Response time: " + getPingResponseTime(hostnameOrIP, timeout));
      }
    } catch (Exception e) {
      System.out.println("Usage: java PingTest <hostname/IP address> <timeout in milliseconds> <number of pings to send>\n");
    }
  }

  static long getPingResponseTime(String hostnameOrIP, int timeout) {
      long startTime = System.currentTimeMillis();

      boolean successfulPing = false;

      try {
        successfulPing = InetAddress.getByName(hostnameOrIP).isReachable(timeout);
      } catch (IOException ioe) {
        successfulPing = false;
      }

      long endTime = System.currentTimeMillis();

      long responseTime = endTime-startTime;

      if (successfulPing == false)
        responseTime = -1;

      return responseTime;
  }

}

Вот результаты, которые я получил, когда запустил следующее на Mac OS (результаты в миллисекундах):

$ sudo java PingTest google.com 5000 5
Pinging 'google.com'
Response time: 419
Response time: 15
Response time: 15
Response time: 16
Response time: 16

Время отклика может варьироваться между запусками, но я вижу <20 миллисекунд времени отклика для большинства крупных сайтов, особенно если вы запускаете несколько пингов </p>

1 голос
/ 01 мая 2011

System.out (...) - и консоль Java - весьма ограничены в кодировании.Вы можете ожидать, что основные символы ASCII будут работать, и это все.Если вы хотите использовать любую другую кодировку, то вы должны записать вывод в текстовый файл или графический интерфейс.Если вы пишете в консоль, вам всегда придется справляться с плохой обработкой различных не-ASCII символов.

0 голосов
/ 05 июня 2013

Попробуйте эту команду командной строки:

chcp

Моя командная строка ответила 866, поэтому я использовал CP866

0 голосов
/ 02 июля 2011

Вам нужно изменить настройки кодировки затмения по умолчанию в настройках.Может быть установлено на UTF8.

...