Java Process.getInputStream()直到执行结束才返回数据

时间:2013-08-03 09:52:45

标签: java process inputstream

我一直在尝试创建一个Java程序,最终将用于使用hostapd和dnsmasq软件包控制Linux中的Wi-Fi接入点(分别是接入点和DNS / DHCP服务器) )。

至关重要的是,我可以在执行时读取hostapd的StdOut,因为它返回必须解析的数据以向用户显示重要数据。

为此,我使用以下代码:

// Start access point
MainFrame.instance.setStatus("Starting access point...");
List<String> cmd = new ArrayList<String>();

// sudo hostapd /etc/hostapd.conf
cmd.add("/usr/bin/sudo");
cmd.add("/usr/sbin/hostapd");
cmd.add("/etc/hostapd.conf");

ProcessBuilder ps = new ProcessBuilder();
ps.command(cmd);
ps.redirectErrorStream(true);
Process p = ps.start();

//Process p = Runtime.getRuntime().exec("sudo hostapd /etc/hostapd.conf");

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
MainFrame.instance.setStatus("Running");
MainFrame.instance.setRunning(true);
while ((line = input.readLine()) != null) {
    System.out.println(line);
    output += (line + '\n');
    if (line.contains("AP-STA-CONNECTED")) {
        addClientToList(line);
    } else if (line.contains("AP-STA-DISCONNECTED")) {
        removeClientFromList(line);
    }
}
input.close();

但是,在hostapd终止之前,不会返回任何数据。如果用户在终端中执行相同的命令(sudo hostapd /etc/hostapd.conf),则数据会正确显示。为什么我无法从InputStream获取数据?

我对Java很新,因此我可能会错过一些非常明显的错误,但如果是这样,请告诉我:)

1 个答案:

答案 0 :(得分:0)

编辑:添加截图后,这似乎不是问题。然后你可能会阻止AWT事件线程,因此无法重新绘制GUI。 GUI仅在AWT线程空闲时更新。为了解决该问题,请在单独的线程中执行代码。

new Thread("Data Fetcher", new Runnable()
{
     public void run()
     {
          // Here comes your original code you posted.
     }
}). start();

但是,只要您的应用程序投入生产,请记住:

sudo最有可能提示输入管理员的密码。我记得gksudo会弹出一个对话框,让你输入密码。

我从来没有对它进行测试,但有可能通过p.getOutputStream()编写密码,然后换行和刷新可能会有效。