簡體   English   中英

將程序輸出重定向為輸入-管道不起作用

[英]Redirecting program output as input - pipe not working

我正在使用BufferedReader將一個程序(C ++)的輸出作為另一個(Java)的輸入。 當我在IDE中運行Java程序並在控制台中輸入輸入時,該程序將按預期運行,但是,當我嘗試從C ++程序中傳遞輸入時,它將不再起作用且沒有給出錯誤-終端上未顯示任何輸出窗口,並且沒有數據輸入數據庫。 還值得注意的是,如果我嘗試在終端窗口中運行jar並輸入輸入,則該程序也將無法運行。

讀者代碼:

BufferedReader input;
      try {
        input = new BufferedReader(new InputStreamReader(System.in));
        String outputLine;
        String visionObjectName;
        String visionObjectTimestamp;
        String word = null;
        String timestamp = null;
        String whiteSpace = null;
        // Regex is used to check that the output is an object "name blankSpace timestamp" to avoid random output such as errors being entered.
        while ((outputLine = input.readLine()) != null) {
          System.out.println(outputLine);
          String regEx = "(^[a-zA-Z]*)(\\s+)((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))";
          Pattern p = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
          Matcher m = p.matcher(outputLine);
          if (m.find()) {
            word = m.group(1);
            whiteSpace = m.group(2);
            timestamp = m.group(3);
          }
          visionObjectName = word + "" + whiteSpace;
          visionObjectTimestamp = timestamp;
          databasePopulation(visionObjectName, visionObjectTimestamp);
        }

我正在使用Linux終端管道功能來傳遞信息。

命令:

./ORBMarkerDetection | java -jar ../layers/out/artifacts/layers_jar/layers.jar

編輯:為徹底起見,我已經包括了C ++程序的輸出代碼,我用來打印時間戳的方法會引起問題嗎?

int timeFound() {
  time_t rawtime;
  struct tm * timeinfo;
  char buffer [80];
  time(&rawtime);
  timeinfo = localtime (&rawtime);
  strftime(buffer,80,"%Y-%m-%d %H:%M:%S",timeinfo);
  puts(buffer);
  return 0;
}

void printFunction(String objectName) {
  if(nameArray[0] != objectName) {
    nameArray[0] = objectName;
    cout << nameArray[0] << " ";
    timeFound();
    cout << flush;
  }
}

如注釋中所要求的,這是C ++輸出的示例(從Aug 17....opengl support available僅在程序啟動時打印,不再打印。

Aug 17, 2015 11:57:03 AM com.layers.Main main
INFO: Logger Created.
Please enter activity number: 
1.1
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
init done 
opengl support available 
tap 2015-08-17 11:57:07
kitchenDoor 2015-08-17 12:57:07
fridge 2015-08-17 13:57:07

另外,如果我注釋掉范圍末尾的那一行:

String regEx...
...
}

Java程序會按預期輸出到終端,但是我不得不注釋掉數據庫上載以進行測試,因此我無法驗證上載是否有效。

我的猜測是您的程序被阻塞在與管道無關的東西中。 最有可能是數據庫。 IDE可能設置的類路徑和/或VM選項與您在終端上輸入的不同。

獲取由IDE運行的確切命令行,如果您不知道如何使用IDE執行此操作,則可以使用jps和/ proc // cmdline進行操作。

例如。 如果我在IDE中運行程序時運行jps,則會看到:

13923 Jps 11333 MyJFrame 15006主

我知道我的主類是MyJFrame,所以我知道我的PID必須是11333。

如果我運行cat / proc / 11333 / cmdline,則會得到:

/usr/local/jdk1.8.0_25/bin/java-Dfile.encoding=UTF-8-classpath/home/shackle/NetBeansProjects/JavaApplication31/build/classesjavaapplication31.MyJFrame

它缺少參數之間的空格,但是很明顯它們將去向何處。 在終端上小心插入空格后,運行該命令。

另外,最好是在運行jar時准確查看正在執行的行,並且不會產生任何輸出。 運行原始命令,使用jps獲取pid,在該pid上使用jstack獲取所有堆棧幀,包括被阻塞的行。

最后,我刪除了defauls jar配置並重新添加了它,以解決此問題,下面是使用IntelliJ IDEA的其他用戶的說明。

File -> Project Structure -> Artifacts

然后使用minus小按鈕刪除jar設置,並使用plus重新添加。

JAR -> From modules with dependencies -> OK

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM