You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
        }
    }
}

关键实现说明

  1. 命令执行:使用ProcessBuilder替代Runtime.exec,它支持更灵活的参数配置,进程控制更稳定。
  2. 逐行解析:通过BufferedReader逐行读取输出,跳过空行和表头,避免硬编码替换表头文本的不可靠性。
  3. 列分割:用\\s+正则表达式分割行内容,适配netstat输出中多空格分隔的列格式。
  4. 任务处理:
    • 任务1:直接判断协议为TCP时输出整行
    • 任务2:利用HashSet自动去重的特性存储本地地址
    • 任务3:用HashMap统计TCP连接的State出现次数,注意UDP没有State列,需做判断过滤

内容的提问来源于stack exchange,提问作者chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:50:24