如何通过某种调用将unix hostid变为Java?
答案 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;
}
}