Java getInputStream()在执行结束之前不会返回数据

Java getInputStream()在执行结束之前不会返回数据,java,process,inputstream,Java,Process,Inputstream,我一直在尝试创建一个Java程序,最终将使用hostapd和dnsmasq包(分别是接入点和DNS/DHCP服务器)来控制Linux中的Wi-Fi接入点 在执行hostapd时读取它的StdOut非常重要,因为它返回的数据必须经过解析才能向用户显示重要数据 为此,我使用以下代码: // Start access point MainFrame.instance.setStatus("Starting access point..."); List<String> cmd = new

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

在执行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();
//启动接入点
MainFrame.instance.setStatus(“起始访问点…”);
List cmd=new ArrayList();
//sudo hostapd/etc/hostapd.conf
cmd.add(“/usr/bin/sudo”);
cmd.add(“/usr/sbin/hostapd”);
cmd.add(“/etc/hostapd.conf”);
ProcessBuilder ps=新的ProcessBuilder();
ps.command(cmd);
ps.errorstream(真);
进程p=ps.start();
//进程p=Runtime.getRuntime().exec(“sudo hostapd/etc/hostapd.conf”);
BufferedReader输入=新的BufferedReader(新的InputStreamReader(p.getInputStream());
MainFrame.instance.setStatus(“正在运行”);
MainFrame.instance.setRunning(true);
而((line=input.readLine())!=null){
系统输出打印项次(行);
输出+=(行+'\n');
if(线路包含(“AP-STA-CONNECTED”)){
addClientToList(行);
}否则,如果(行包含(“AP-STA-DISCONNECTED”)){
removeClientFromList(行);
}
}
input.close();
但是,在hostapd终止之前,不会返回任何数据。如果用户在终端中执行相同的命令(
sudo hostapd/etc/hostapd.conf
),数据将正确显示。为什么我不能从InputStream获取数据


我对Java相当陌生,所以这里可能有一些我遗漏的非常明显的错误,但如果是这样,请告诉我:)

编辑:在添加屏幕截图后,这似乎不是问题。那么您可能正在阻塞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()
写入密码,然后换行和刷新就可以了。

只是猜测,但readLine在换行符/回车符(一个或两个)或null时终止,可能没有返回cr/lf?所以readline只有在hostapd终止时才返回?不,我确信它返回时带有某种cr或lf。我稍微编辑了我的代码,以便将这一行添加到ArrayList中,结果如下:我以root/superuser的身份运行IDE,这反过来将以superuser的身份启动Java,从而使Java应用程序能够在不需要密码的情况下启动sudo命令。我应该把这个放在主帖子里,很抱歉不够清楚:)而且,如果进程要求输入密码,它根本不会返回任何输出,因为“hostapd”一开始就不会运行;正在作为
Runnable hotspotLauncher=new hotspotLauncher()调用后跟
线程启动器线程=新线程(热点启动器),将daemon设置为true并启动()。这就是我现在正在做的。