5

ターゲットIPアドレスにpingを実行して応答を受け取りたい。これを実現するために、Javaでruntime.execメソッドとプロセスクラスを使用してWindowsコマンドラインを使用しています。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);
4

6 に答える 6

6

これを修正するには、現在のオペレーティングシステムがコマンドラインで使用している文字セットを確認し、この文字セットと互換性のあるデータを取得する必要があります。

トルコ語のXPコマンドラインの文字セットはCP857であることがわかりました。以下のようにコードを編集すると、問題は解決します。

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

あなたの助けのためのThx。

注:デフォルトのコマンドライン文字セットは、「chcp」コマンドで学習できます。

于 2011-05-04T18:53:17.017 に答える
2

pingを実行して応答時間を取得するだけでよい場合は、コンソールから出力を読み取るのはやり過ぎかもしれません。Java5以降を使用している限り、より簡単な方法があります。

これを行うために使用できる完全なプログラムを次に示します。注:Unix / Linux / Mac OSでは、「localhost」以外から応答を取得するには、「sudo」でこのプログラムを実行する必要があります。

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

応答時間は実行ごとに異なる場合がありますが、特に複数のpingを実行する場合、ほとんどの主要なサイトへの応答時間は20ミリ秒未満です。

于 2011-05-01T17:47:40.450 に答える
2

文字は正しく取得されているが、System.outが正しく印刷していないと言っていますか?System.outは間違いなく古いクラ​​スです。多分試してみてください

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

それはうまくいくかもしれません

于 2011-05-01T17:53:33.347 に答える
1

System.out(...)-およびJavaコンソール-のエンコーディングはかなり制限されています。基本的なASCII文字が機能することを期待できますが、それだけです。他のエンコーディングを使用する場合は、出力をテキストファイルまたはGUIに書き込む必要があります。コンソールに書き込む場合は、さまざまな非ASCII文字の不適切な処理に常に対処する必要があります。

于 2011-05-01T18:55:12.183 に答える
0

設定でEclipseのデフォルトのエンコーディング設定を変更する必要があります。に設定できますUTF8

于 2011-07-02T12:14:08.230 に答える
0

次のコマンドラインコマンドを試してください。

chcp

コマンドラインが866と応答したので、CP866を使用しました

于 2013-06-05T10:07:59.497 に答える