进程暂停时Java runtime exec getInputStream

进程暂停时Java runtime exec getInputStream,java,Java,我正在为在windows命令行上运行的可执行文件创建包装。可执行文件接受一些命令,然后尝试连接到另一个设备。然后它输出错误!或者准备好“设备名称”直到应用程序退出,我才收到此消息。问题是,这个应用程序是一个隧道,允许我在外部设备上运行telnet,但我需要确保设备已准备就绪。这是我的代码 public void startUDPTunnel() { //TODO Pull Amino serial number from webportal Properties prop = n

我正在为在windows命令行上运行的可执行文件创建包装。可执行文件接受一些命令,然后尝试连接到另一个设备。然后它输出错误!或者准备好“设备名称”直到应用程序退出,我才收到此消息。问题是,这个应用程序是一个隧道,允许我在外部设备上运行telnet,但我需要确保设备已准备就绪。这是我的代码

public void startUDPTunnel() {
    //TODO Pull Amino serial number from webportal
    Properties prop = new Properties();
    InputStream inConfig = getClass().getClassLoader().getResourceAsStream("config.properties");
    try {
        prop.load(inConfig);
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
    String server = prop.getProperty("server");//config.GetProp("server");
    System.out.println(server);
    String port = prop.getProperty("port");//config.GetProp("port");
    System.out.println(port);
    String location = prop.getProperty("location");//config.GetProp("location");
    System.out.println(location);
    String url = prop.getProperty("URL");
    System.out.println(url);
    String input = "";
    try {
        input = getSerial(url);
        System.out.println(input);
        Process p = Runtime.getRuntime().exec(location+"udptunnel.exe -c 127.0.0.1 23 "+input+" "+server+" "+port+" 127.0.0.1 23");  

        threadSleep();
        BufferedReader in = new BufferedReader(
                            new InputStreamReader(p.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            if(line.equals("ERROR!")){
                System.out.println("There was an ERROR");
            }
            if(line.equals("Ready for \""+input+"\"")){
                System.out.println("Load Telnet");
            }
        }
        p.destroy();
    } catch (IOException e) {  
        e.printStackTrace();  
    }
}
很抱歉,此函数中还有很多调试代码

编辑


好的,我非常确定bufferReader的问题是什么。readLine()需要一个\n或\r或只是挂起,在没有缓冲区的情况下是否仍然可以观看流?

您应该使用,然后使用。我认为这将导致进程的
stdout
被取消缓冲。即使没有,您只需从一个
InputStream
读取即可获得
stdout
stderr

我已经解决了我的问题,我用java执行的应用程序在行尾没有EOL,事实上它们只是挂在行上,例如telnet等待用户名,然后等待密码。我不确定这是正确的,但它的工作,是我现在要使用的

while((i=br.read())!=-1){
    ch += (char)i;
}

这会在输入时输出每个字符,然后确保字符串包含我要查找的内容

如果希望代码在流程运行时获取流程输出,则该流程将需要在运行时输出某些内容,而不仅仅是在退出时。该流程会输出它输出的“错误”或“准备就绪”内容如果它确实准备好了,那么它将等待,直到您退出telnet后,通过隧道连接到telnet。但是如果它有一个错误,那么这个过程就结束了。