将Unix hostid转换为Java

时间:2011-06-23 21:54:41

标签: java linux unix uniqueidentifier

如何通过某种调用将unix hostid变为Java?

http://linux.about.com/library/cmd/blcmdl1_hostid.htm

5 个答案:

答案 0 :(得分:2)

如果之前调用sethostid(long int id)设置了它,它将驻留在HOSTIDFILE,通常为/etc/hostid

如果不存在,则获取计算机的主机名。你拉出主机名的地址,如果是IPv4,那就是从点分十进制到二进制格式的IPv4地址,最高16位和低16位交换。

InetAddress addr = InetAddress.getLocalHost();
byte[] ipaddr = addr.getAddress();
if (ipaddr.length == 4) {
  int hostid = 0 | ipaddr[1] << 24 | ipaddr[0] << 16 | ipaddr[3] << 8 | ipaddr[2];
  StringBuilder sb = new StringBuilder();
  Formatter formatter = new Formatter(sb, Locale.US);
  formatter.format("%08x", hostid);
  System.out.println(sb.toString());
} else {
  throw new Exception("hostid for IPv6 addresses not implemented yet");
}

答案 1 :(得分:1)

我害怕你必须写JNI(或JNA)。

答案 2 :(得分:1)

答案 3 :(得分:1)

调用Runtime.exec(String),其中参数是“hostid”可执行文件的路径,然后排出生成的Process object的两个流,并将标准输出流的内容作为字符串值。

这个简单的类演示了如何实现这个策略(但需要改进错误处理[例如stderr,例外]和OOP最佳实践[例如返回具有bean属性的对象等]):

public class RunCommand {
  public static String exec(String command) throws Exception {
    Process p = Runtime.getRuntime().exec(command);
    String stdout = drain(p.getInputStream());
    String stderr = drain(p.getErrorStream());
    return stdout; // TODO: return stderr also...
  }
  private static String drain(InputStream in) throws IOException {
    int b = -1;
    StringBuilder buf = new StringBuilder();
    while ((b=in.read()) != -1) buf.append((char) b);
    return buf.toString();
  }
}

您的程序可以这样使用它:

String myHostId = RunCommand.exec("/usr/bin/hostid").trim();

请注意,如果您的命令需要参数或环境等,使用ProcessBuilder创建Process可能比Runtime.exec()更合适。

答案 4 :(得分:-2)

试试这个(当然包在某些课程中):

import java.net.InetAddress;
import java.net.UnknownHostException;

public static String getLocalHostIP()
    throws UnknownHostException
{
    InetAddress  ip;

    ip = InetAddress.getLocalHost();
    return ip.getHostAddress();
}

该方法返回“xxx.xxx.xxx.xxx”形式的字符串。

<强>更新

改进的方法是:

// Determine the IP address of the local host
public static String getLocalHostIP()
{
    try
    {
        return InetAddress.getLocalHost().getHostAddress();
    }
    catch (UnknownHostException ex)
    {
        return null;
    }
}