Java执行netstat命令并完成三类数据处理任务的实现方法
Java执行
netstat -an并完成三类统计任务的实现方案 需求
需要在Java中执行netstat -an命令,解析输出并完成以下三个任务:
- 仅在控制台显示TCP相关的完整行信息
- 提取并显示
Local Address列中的唯一地址 - 按
State列分组,统计每种状态的出现次数
netstat输出示例
Proto Local Address Foreign Address State TCP 0.0.0.0:135 0.0.0.0:0 LISTENING TCP 0.0.0.0:445 0.0.0.0:0 LISTENING TCP 0.0.0.0:554 0.0.0.0:0 LISTENING UDP 0.0.0.0:3702 *:* UDP 0.0.0.0:3702 *:* UDP 0.0.0.0:3702 *:*
各任务期望输出
任务1(仅显示TCP详情)
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING TCP 0.0.0.0:445 0.0.0.0:0 LISTENING TCP 0.0.0.0:554 0.0.0.0:0 LISTENING
任务2(唯一本地地址)
0.0.0.0:135 0.0.0.0:445 0.0.0.0:554 0.0.0.0:3702
任务3(State分组统计)
LISTENING = 3
你的尝试代码
String s1= null; String s2= null; InputStream i=Runtime.getRuntime().exec("netstat -an").getInputStream(); Scanner scan=new Scanner(i).useDelimiter("\\"+"\n"+"\n"); s1=scan.hasNext()?scan.next():null; List<String> l=new ArrayList<String>(); try { l.add(s1.replaceAll("Active Connections\r\n" + "\r\n" + " Proto Local Address Foreign Address State", "")); for(String a:l) { System.out.println(a); } }catch(Exception e){ e.printStackTrace(); }
正确实现方案
下面是完整的实现代码,采用逐行解析的方式,使用更可靠的ProcessBuilder执行命令,同时用集合类处理去重和统计需求:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class NetstatParser { public static void main(String[] args) { // 初始化数据结构:HashSet去重本地地址,HashMap统计状态数量 Set<String> uniqueLocalAddresses = new HashSet<>(); Map<String, Integer> stateCountMap = new HashMap<>(); try { // 用ProcessBuilder执行命令,比Runtime.exec更稳定 Process process = new ProcessBuilder("netstat", "-an").start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; boolean skipHeader = true; // 逐行读取命令输出 while ((line = reader.readLine()) != null) { line = line.trim(); // 跳过空行和表头 if (line.isEmpty() || skipHeader) { // 识别到表头行后,后续不再跳过 if (line.contains("Proto")) { skipHeader = false; } continue; } // 按多个空格分割列,适配netstat的多空格分隔格式 String[] columns = line.split("\\s+"); if (columns.length < 2) { continue; } String proto = columns[0]; String localAddress = columns[1]; // 任务1:输出TCP相关的完整行 if ("TCP".equals(proto)) { System.out.println(line); } // 任务2:收集唯一本地地址,HashSet自动去重 uniqueLocalAddresses.add(localAddress); // 任务3:统计TCP连接的State数量,UDP无State列需跳过 if ("TCP".equals(proto) && columns.length >= 4) { String state = columns[3]; stateCountMap.put(state, stateCountMap.getOrDefault(state, 0) + 1); } } // 输出任务2结果 System.out.println("\n=== 唯一本地地址 ==="); for (String addr : uniqueLocalAddresses) { System.out.println(addr); } // 输出任务3结果 System.out.println("\n=== State分组统计 ==="); for (Map.Entry<String, Integer> entry : stateCountMap.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } reader.close(); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
关键实现说明
- 命令执行:使用
ProcessBuilder替代Runtime.exec,它支持更灵活的参数配置,进程控制更稳定。 - 逐行解析:通过
BufferedReader逐行读取输出,跳过空行和表头,避免硬编码替换表头文本的不可靠性。 - 列分割:用
\\s+正则表达式分割行内容,适配netstat输出中多空格分隔的列格式。 - 任务处理:
- 任务1:直接判断协议为TCP时输出整行
- 任务2:利用
HashSet自动去重的特性存储本地地址 - 任务3:用
HashMap统计TCP连接的State出现次数,注意UDP没有State列,需做判断过滤
内容的提问来源于stack exchange,提问作者chan
相关产品推荐
相关产品推荐

