繁体   English   中英

进程暂停时Java运行时执行程序getInputStream

[英]Java runtime exec getInputStream when process pauses

我正在为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或只是挂起,无论如何在没有缓冲区的情况下观看流?

您应该使用ProcessBuilder ,然后使用redirectErrorStream() 认为这将导致该进程的stdout无法缓冲。 即使没有,您也只需要从一个InputStream读取即可获取stdoutstderr

我已经解决了我的问题,我用Java执行的应用程序在行尾没有EOL,实际上它们只是挂在行上,例如telnet等待用户名然后输入密码。 我不确定这是否合适,但它是否有效,这是我现在要使用的

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

当他们刚进入时,这会输出每个字符,而我只是要确保字符串包含我在寻找什么!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM