在 Java 中,获取当前 DNS 服务器信息(如系统配置的 DNS 地址)通常需要依赖操作系统命令,因为标准 Java API 不直接提供此功能,以下是两种常用方法:
通过解析系统命令的输出获取 DNS 信息:
import java.io.*;
import java.util.*;
public class DNSUtil {
public static List<String> getSystemDnsServers() throws IOException {
String os = System.getProperty("os.name").toLowerCase();
String command = os.contains("win") ?
"ipconfig /all | findstr \"DNS Servers\"" :
"cat /etc/resolv.conf | grep -E '^nameserver\\s+'";
Process process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", command});
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
List<String> dnsServers = new ArrayList<>();
String line;
while ((line = reader.readLine()) != null) {
String server = extractDnsFromLine(line, os);
if (server != null) dnsServers.add(server);
}
return dnsServers;
}
}
private static String extractDnsFromLine(String line, String os) {
if (os.contains("win")) {
// Windows 示例: "DNS Servers . . . . . : 8.8.8.8"
int idx = line.indexOf(':');
return (idx != -1) ? line.substring(idx + 1).trim() : null;
} else {
// Linux/macOS 示例: "nameserver 8.8.8.8"
return line.replaceAll("^nameserver\\s+", "").trim();
}
}
public static void main(String[] args) throws IOException {
System.out.println("System DNS Servers: " + getSystemDnsServers());
}
}使用[dnsjava](http://www.dnsjava.org/) 库获取本地 DNS 缓存(非系统配置,但反映实际使用的 DNS):
1、添加依赖(Maven):
<dependency>
<groupId>dnsjava</groupId>
<artifactId>dnsjava</artifactId>
<version>3.5.2</version>
</dependency>2、示例代码:
import org.xbill.DNS.Resolver;
import org.xbill.DNS.SimpleResolver;
import java.net.InetAddress;
public class DnsLookup {
public static void main(String[] args) throws Exception {
// 获取系统默认 DNS 解析器地址
Resolver resolver = new SimpleResolver();
InetAddress dnsServer = ((SimpleResolver) resolver).getAddress();
System.out.println("Active DNS Server: " + dnsServer.getHostAddress());
}
}1、系统命令方式:
局限性:依赖操作系统和语言环境(如 Windows 中文版需替换"DNS Servers" 为"DNS 服务器")。
权限:需要允许执行系统命令。
2、dnsjava 方式:
- 获取的是 JVM实际使用的 DNS 服务器(可能来自系统 DHCP 或手动配置)。
- 更可靠跨平台,但反映的是运行时解析行为,非原始系统配置。
- Windows:
System DNS Servers: [192.168.1.1, 8.8.8.8]
- Linux/macOS:
System DNS Servers: [8.8.8.8, 1.1.1.1]
根据需求选择合适方法,若需精确系统配置,方法 1 更直接;若关注运行时行为,方法 2 更可靠。
文章摘自:https://idc.huochengrm.cn/dns/12931.html
评论
詹运鸿
回复Java无法直接获取当前DNS设置,因为这是一个系统级别的配置,但可以通过执行外部命令(如使用Runtime.exec)调用操作系统提供的工具来获取这些信息。(字数:45字)。
钟离志诚
回复Java无法直接获取当前DNS设置,但可以通过系统属性或网络配置间接了解。