在Java中获取Linux下的网络网卡信息,主要涉及到Java的Runtime类、ProcessBuilder类以及对Linux命令行工具(如ifconfig或ip)输出结果的解析。下面的代码通过Java获取Linux下网卡的基本信息:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class NetworkInterfaceInfo {
public static void main(String[] args) {
try {
// 使用Runtime.getRuntime().exec执行Linux命令
Process process = Runtime.getRuntime().exec("ifconfig -a");
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
// 对输出进行处理,这里仅简单打印
System.out.println(line);
// 解析网卡信息,例如,对于eth0设备的IP地址,可以这样解析:
if (line.startsWith("inet ")) {
String[] parts = line.split("\s+");
if (parts.length > 1 && !parts[1].startsWith("127.")) { // 过滤掉loopback地址
System.out.println("Network Interface: " + parts[0].substring(5));
System.out.println("IP Address: " + parts[1]);
}
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上代码会执行Linux的ifconfig -a命令获取所有网络接口的信息,并且对每行输出进行解析,提取出非回环IP地址(即非127.0.0.1)的网络接口名称和IP地址。
然而,这种方式依赖于Linux系统的具体命令格式,可能在不同的系统版本或环境下存在兼容性问题。为了更稳定和准确地获取网卡信息,推荐使用Java的java.net.NetworkInterface类,或者第三方库如oshi等来实现跨平台的网络接口查询。
以下是使用java.net.NetworkInterface类获取网卡信息的代码:
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class NetworkInterfaceInfo {
public static void main(String[] args) throws SocketException {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface ni = networkInterfaces.nextElement();
System.out.println("Network Interface Name: " + ni.getName());
Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress ia = inetAddresses.nextElement();
System.out.println("IP Address: " + ia.getHostAddress());
}
}
}
}
这段代码会列出所有可用网络接口及其IP地址,它在各种Java支持的操作系统上都能良好运行。