【问题标题】:Java inputStreamReader CharsetJava inputStreamReader 字符集
【发布时间】:2011-08-16 12:55:57
【问题描述】:

我想 ping 一个目标 IP 地址并接收响应。为此,我在 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);

【问题讨论】:

  • 如果您知道您的编码是“windows-1254”,为什么还要指定“UTF-8”?
  • 呃,您指定的是UTF8
  • 我尝试了 windows-1254,不幸的是,结果相同。

标签: java character-encoding inputstream inputstreamreader


【解决方案1】:

为了解决这个问题,检查当前操作系统在其命令行上使用的字符集并获取与该字符集兼容的数据是必要的。

我发现土耳其语XP命令行的字符集是CP857,当你像下面这样编辑代码时,问题就解决了。

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

感谢您的帮助。

注意:您可以通过“chcp”命令了解您的默认命令行字符集。

【讨论】:

    【解决方案2】:

    您是说字符被正确检索但 System.out 打印不正确? System.out 绝对是一个 OLD 类。可以试试

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

    这可能有效

    【讨论】:

    • 我不想打印这个结果,我想得到数字 ping 响应值。我会从这个值之前的词中找到那个数值(时间=55ms,搜索时间词)
    【解决方案3】:

    如果您只需要 ping 并获取响应时间,那么从控制台读取输出可能会过大。只要您使用的是 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
    

    响应时间可能因运行而异,但我发现大多数主要网站的响应时间

    【讨论】:

    • isReachable 产生一个布尔值,但我想要一个数值,所以我想知道它响应目标设备的次数。 Windows命令行对我来说很方便,因为下次我会用命令行(telnet等)做另一件事。
    • 我已经修改了我的答案来计算响应时间。只要“isReachable”返回true,那么你就知道它成功了,计算开始和结束时间是微不足道的。如果“isReachable”为假,则(1)系统不在线/不响应 ping,或者(2)在“超时”到期之前没有响应。
    • 我刚试过这个,根据我的ip,在命令行ping(cmd)ping结果大约是75ms,但是这个程序产生了大约2000ms。不幸的是,它不能正常工作。
    • 我编辑了我的答案/代码示例以包含一个完整的程序来执行此操作。我从我的机器到主要网站(例如 google.com)的响应时间很长。如果您只是使用“java PingTest”从命令行运行它,它将输出用法,并解释如何使用它。祝你好运!
    • Maozturk - 你循环了几次,让 JVM 预热?
    【解决方案4】:

    System.out(...) - 和 Java 控制台 - 在编码方面非常有限。您可以期望基本的 ASCII 字符能够正常工作,仅此而已。如果您想使用任何其他编码,那么您应该将输出写入文本文件或 GUI。如果你写到控制台,你总是不得不应对各种非 ASCII 字符的糟糕处理。

    【讨论】:

    • 实际上,我将在网页中使用 ping 结果(毫秒),但我必须从不包含土耳其字符的文本中获取数字 ping 结果。我能做什么?
    【解决方案5】:

    您需要在首选项下更改您的 Eclipse 默认编码设置。可以设置为UTF8

    【讨论】:

    • 是什么让你认为 OP 正在使用 Eclipse?
    • 我不使用 Eclipse,我使用的是 Netbeans,我的 IDE 默认编码设置已经是 UTF8。此外,我解决了这个问题。解决方案在我的回答中。感谢您的回答。
    【解决方案6】:

    试试这个命令行命令:

    chcp

    我的命令行回答为 866,所以我使用了 CP866

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 2015-08-12
      • 2014-09-22
      • 1970-01-01
      相关资源
      最近更新 更多