在Java中获取Linux下的网络网卡信息

225 阅读1分钟

在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支持的操作系统上都能良好运行。