Java ProcessBuilder EXE文件无法正确获取输入流

时间:2016-05-10 17:11:22

标签: java c++ processbuilder

我正在构建一个用于c ++程序的Java GUI,并且我很痴迷于调用我的exe文件的ProcessBuilder。

我用C ++编写这个小程序只是为了测试这个ProcessBuilder的东西,看看我是否可以控制I / O流:

df_sample1['counties'].fillna("", inplace=True)

我的Java代码如下:

func mapView(mapaView: MKMapView, viewForAnnotation anotacion: MKAnnotation) -> MKAnnotationView? {

        if !(anotacion is MKAnnotationCostum) {

            let reusarId = "anotacion"

            var anotacionView = mapaView.dequeueReusableAnnotationViewWithIdentifier(reusarId)
            if anotacionView == nil {
                anotacionView = MKAnnotationView(annotation: anotacion, reuseIdentifier: reusarId)

                anotacionView!.canShowCallout = true
                anotacionView!.leftCalloutAccessoryView = UIImageView(image: UIImage(named: "Amarillo"))
            }
            else {

                anotacionView!.annotation = anotacion
            }

            return anotacionView
        }

        let reusarId = "anotacion"

        var  anotacionView = mapaView.dequeueReusableAnnotationViewWithIdentifier(reusarId)
        let costum = anotacion as! MKAnnotationCostum
        if anotacionView == nil {
            anotacionView = MKAnnotationView(annotation: costum, reuseIdentifier: reusarId)
            //let costumView = anotacionView as! MKAnnotationCostum
       if costum.tipo == "temp" {
       anotacionView!.image = UIImage(named:"someImage")
        } else {
            anotacionView!.image = UIImage(named:"Amarillo")
       }
            anotacionView!.leftCalloutAccessoryView = UIImageView(image: UIImage(named: "marca"))
            anotacionView!.canShowCallout = true

        }else {
            anotacionView!.annotation = anotacion
        }
        return anotacionView
    }

代码不会提示任何错误,只是挂起while循环。它不打印任何东西。 这段代码可以正常使用" echo"这样的命令,所以我不知道我在这里做错了什么。

(如果你们有更好的建议来控制来自除ProcessBuilder以外的Java的c ++ exe进程中的i / o流,我很高兴)

提前致谢, Maarc~

1 个答案:

答案 0 :(得分:0)

BufferedReader#readLine()阻止,直到有完整的行可用,通过接收换行符表示。

您的C ++代码会打印提示但没有换行符。这会导致readLine()无法返回,从而导致您看到的行为。如果您希望Java和C ++代码进行交互,则必须定义一个“协议”,以便在消息完成并准备好对其进行操作时进行通信。这可以像换行一样简单,如果您的需求不同则更复杂。这完全取决于你,但如果你正在处理一些现有的C ++程序并希望从Java控制它,你必须准备好处理它。

例如,如果C ++程序提示没有换行符而您无法更改,则可能需要在提示字符串的末尾查找冒号:。这意味着Java代码不能使用readLine(),并且必须一次处理一个字符输入。