[英]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.