Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
netstat和grep在Java中失败了_Java - Fatal编程技术网

netstat和grep在Java中失败了

netstat和grep在Java中失败了,java,Java,我正在windows7上的cygwin中运行以下代码,但它没有给出输出,有人能帮我吗? 我在linux框中通过runtime exec()调用使用了“netstat-a | grep-builded”,并获得了所有其他状态,但我只需要已建立的状态。(有人能帮忙吗?) }我将在一个单独的线程中读取输入流和错误流,这样就不会阻塞主线程,从而使程序处于挂起状态 首先,我建议创建一个方法,用于创建和启动线程并读取流: private static Thread readFromStream(InputS

我正在windows7上的cygwin中运行以下代码,但它没有给出输出,有人能帮我吗? 我在linux框中通过runtime exec()调用使用了“netstat-a | grep-builded”,并获得了所有其他状态,但我只需要已建立的状态。(有人能帮忙吗?)


}我将在一个单独的线程中读取输入流和错误流,这样就不会阻塞主线程,从而使程序处于挂起状态

首先,我建议创建一个方法,用于创建和启动线程并读取流:

private static Thread readFromStream(InputStream stdin, PrintStream out, String name) throws IOException {
    Thread thread = new Thread(() -> {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(stdin))) {
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }, name);
    thread.setDaemon(true);
    thread.start();
    return thread;
}
要使用它,您可以使用以下代码:

public static void main(String[] args) {
    try {
//            Process p = Runtime.getRuntime().exec("netstat -anl | grep 'LISTEN \\| ESTABLISHED \\| SYN_SENT \\| SYN_RECV \\| LAST_ACK \\| LAST_ACK \\| CLOSE_WAIT \\| TIME_WAIT \\| CLOSED \\| CLOSING \\| FIN_WAIT1 \\| FIN_WAIT2' | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'");
        Process p = Runtime.getRuntime().exec("cmd.exe /k netstat");
        Thread in = readFromStream(p.getInputStream(), System.out, "in");
        Thread err = readFromStream(p.getErrorStream(), System.err, "err");
        in.join(1000);
        err.join(1000);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
当然,您需要用您的命令替换
Runtime.getRuntime().exec()
中执行的命令


顺便问一下:对于
netstat

,似乎不存在
-l
标志。调试器向您显示的第一点是什么?该程序的行为与您预期的不一样?当时/那里应该发生什么,后来又发生了什么?你看过
流程的文档了吗
getInputStream
返回标准输入。尝试改用
getOutputStream
。Docs:首先检查在没有java的情况下运行命令时是否返回某些内容program@lucasvw,
Process::getInputStream
不返回
stdin
-它返回链接到进程的
stdout
的管道
stdin
由@SairamVinjamuri返回,检查进程的错误流中是否有任何内容。
public static void main(String[] args) {
    try {
//            Process p = Runtime.getRuntime().exec("netstat -anl | grep 'LISTEN \\| ESTABLISHED \\| SYN_SENT \\| SYN_RECV \\| LAST_ACK \\| LAST_ACK \\| CLOSE_WAIT \\| TIME_WAIT \\| CLOSED \\| CLOSING \\| FIN_WAIT1 \\| FIN_WAIT2' | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'");
        Process p = Runtime.getRuntime().exec("cmd.exe /k netstat");
        Thread in = readFromStream(p.getInputStream(), System.out, "in");
        Thread err = readFromStream(p.getErrorStream(), System.err, "err");
        in.join(1000);
        err.join(1000);
    } catch (Exception e) {
        e.printStackTrace();
    }
}