java 子進程輸出流_具有輸入/輸出流的Java進程

首先,我建議更換這條線路。Process?process?=?Runtime.getRuntime?().exec?("/bin/bash");

帶著線條ProcessBuilder?builder?=?new?ProcessBuilder("/bin/bash");builder.redirectErrorStream(true);Process?process?=?builder.start();

ProcessBuilder是Java 5中的新版本,使運行外部進程更容易。在我看來,它比Runtime.getRuntime().exec()它允許您將子進程的標準錯誤重定向到其標準輸出中。這意味著你只有一個InputStream讀。在此之前,您需要有兩個單獨的線程,一個從stdout從stderr,以避免在標準輸出緩沖區為空(導致子進程掛起)時填充標準錯誤緩沖區,反之亦然。

接下來,循環(其中有兩個)while?((line?=?reader.readLine?())?!=?null)?{

System.out.println?("Stdout:?"?+?line);}

只有在reader,它從進程的標準輸出中讀取,返回文件結束。只有當bash進程退出。如果目前沒有進程的輸出,它將不會返回文件末尾。相反,它將等待進程的下一行輸出,直到有了下一行才返回。

由于在到達此循環之前,您要向進程發送兩行輸入,如果在這兩行輸入之后進程尚未退出,則這兩個循環中的第一個循環將掛起。它將坐在那里等待另一行被閱讀,但它將永遠不會有另一行可讀。

我編譯了你的源代碼(我現在Windows上,所以我替換了/bin/bash帶著cmd.exe,但原則應該是相同的),我發現:輸入兩行后,出現前兩個命令的輸出,但是程序掛起,

如果我打字,比如說,

echo test,然后

exit,程序退出了第一個循環,因為

cmd.exe進程已經結束。然后,程序請求另一行輸入(被忽略),直接跳過第二個循環,因為子進程已經退出,然后退出。

如果我輸入

exit然后

echo test,我收到一個IOException抱怨管道被關閉。這是意料之中的-第一行輸入導致進程退出,沒有地方發送第二行。

我在我曾經做過的一個程序中,看到了一個類似于你想要的東西的把戲。這個程序保存了許多shell,在其中運行命令并讀取這些命令的輸出。使用的技巧是始終寫出一個“魔術”行,標記shell命令的輸出結束,并使用它來確定發送到shell的命令的輸出何時完成。

我取下了您的代碼,在分配給您的行之后,我替換了所有的代碼。writer使用以下循環:while?(scan.hasNext())?{

String?input?=?scan.nextLine();

if?(input.trim().equals("exit"))?{

//?Putting?'exit'?amongst?the?echo?--EOF--s?below?doesn't?work.

writer.write("exit\n");

}?else?{

writer.write("(("?+?input?+?")?&&?echo?--EOF--)?||?echo?--EOF--\n");

}

writer.flush();

line?=?reader.readLine();

while?(line?!=?null?&&?!?line.trim().equals("--EOF--"))?{

System.out.println?("Stdout:?"?+?line);

line?=?reader.readLine();

}

if?(line?==?null)?{

break;

}}

完成此操作后,我可以可靠地運行幾個命令,并將每個命令的輸出分別返回給我。

兩人echo --EOF--發送到shell的行中的命令,以確保命令的輸出以--EOF--即使在命令錯誤的結果中。

當然,這種方法也有其局限性。這些限制包括:如果輸入一個等待用戶輸入的命令(例如,另一個shell),則程序似乎掛起,

它假設shell運行的每個進程都以換行符結束其輸出,

如果shell運行的命令恰好寫出一行,就會有點混亂。

--EOF--.

bash如果輸入不匹配的文本,則報告語法錯誤并退出。

).

這些點對你來說可能并不重要,如果你想把它當作一個預定的任務來運行,那么它將被限制在一條命令或一小部分命令上,而這些命令永遠不會以這種病態的方式運行。

編輯:在Linux上運行此程序后,改進退出處理和其他小的更改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383007.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383007.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中if 運算符_[Java]Java基本語法結構(運算符,流程控制語句,if語句)

1:運算符(掌握)(1)算術運算符A:,-,*,/,%,,--B:的用法a:加法b:正號c:字符串連接符C:/和%的區別數據做除法操作的時候,/取得是商,%取得是余數D:和--的用法a:他們的作用是自增或者自減b:使用**單獨使用放在操作數據的前面和后面效果一樣。a或者a效果一樣。*…

java 變量取值范圍_JAVA中的變量及取值范圍

字節是二進制數據的單位。一個字節通常8位長。但是,一些老型號計算機結構使用不同的長度。為了避免混亂,在大多數國際文獻中,使用詞代替byte。變量:變量的數據類型;變量名變量值數據類型基本型數值型(整數)布爾型浮點型…

java object強制類型轉換_scala?object?轉Class?Scala強制類型轉換

asInstanceOf[T]將對象類型強制轉換為T類型。還是由于泛型存在類型擦除的原因,1.asInstanceOf[String]在運行時會拋出ClassCastException異常,而List(1).asInstanceOf[List[String]]將不會。packageresti.webimportorg.springframework.beans.factory.annotation.Au…

java毛玻璃_模糊效果(毛玻璃效果)

模糊效果(毛玻璃效果)效果演示:1. 使用iOS自帶的 UIImageImageEffects 文件文件中有這么幾個方法:- (UIImage *)applyLightEffect;- (UIImage *)applyExtraLightEffect;- (UIImage *)applyDarkEffect;- (UIImage *)applyTintEffectWithColor:(UIColor *)…

java程序崩潰怎么重啟_android 異常崩潰后 重啟app(進程守護方式實現)

【實例簡介】【實例截圖】【核心代碼】package com.sunfusheng.daemon.sample;import android.content.ComponentName;import android.content.Intent;import android.os.Looper;import android.util.Log;import com.blankj.utilcode.util.AppUtils;import com.sunfusheng.daem…

mysql 存儲過程 循環結構 命名_mysql存儲過程----循環結構

循環結構一共分為三種:三種循環結構分別為while、repeat、loop。while循環語法while 表達式(如果表達式為true則執行業務邏輯,否則不執行,與repeat循環相反,repeat循環滿足表達式退出循環,不滿足一直執行) do業務邏輯e…

mysql 組合索引 or_Mysql_組合索引和單列索引

一、目標什么時候使用組合索引,什么時候使用單獨索引組合索引、單獨索引區別組合索引:最左前綴匹配原則二、前期數據準備1. 建表CREATE TABLE user (uidint(11) NOT NULLAUTO_INCREMENT,namevarchar(50) DEFAULT NULL,pwdvarchar(50) DEFAULT NULL,creat…

mysql與mangodb多租戶_MongoDB多租戶(Java):如何使用MongoClient在運行時切換具有不同數據庫憑據的MongoDB數據庫?...

我正面臨一個關于MongoDB多租戶的問題.我有兩個不同的mongoDB數據庫(db1和db2).這兩者都有不同的憑據.db1憑據:userName:admin密碼:passwddb2憑據:userName:admin1密碼:passwd1我需要在運行時從一個數據庫切…

python 庫 全局變量_python局部變量和全局變量global

當你在函數定義內聲明變量的時候,它們與函數外具有相同名稱的其他變量沒有任何關系,即變量名稱對于函數來說是 局部 的。這稱為變量的 作用域 。所有變量的作用域是它們被定義的塊,從它們的名稱被定義的那點開始。使用局部變量例7.3 使用局部…

java 自省_自知 自省 自立 自信 自尊 自治 自強 自制

自知 自省 自立 自信 自尊 自治 自強 自制能知人者有智力,能自知才是真正的智者;能戰勝別人者有力量,能戰勝自己才是真正的強者;能知足者就是富有,能勤奮頑強堅持才是真正的有志者;不失其立足之地的人可以長…

java中json重復數據結構_JAVA把各種數據結構轉換為JSON格式

Java代碼import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import net.sf…

字節字符區別Java_【JAVA基礎】字符數組與字節數組的區別

String.getBytes()和String.tocharArray(),字節數組和字符數組的區別String.getBytes()是將字符串轉化為一個字節數組。而String.toCharArray()是將一個字符串轉化為一個字符數組。【例如】byte bys[] “國慶60周年”.getBytes();char chs[]“國慶60周年”.toCharAr…

mysql日志管理_關于MySQL的日志管理(binlog)

關于MySQL的日志管理(binlog)一、查看binlog的啟用狀態最常用的mysql版本是5.7,默認不開啟binlog,可以在登錄mysql之后,利用以下命令查看當前的binlog啟用狀態:mysql show variables like "%log_bin%";圖中顯示“ON”&a…

java精確測量文本高度_基于文本精確計算UITableViewCell的高度

我正在開發一個ios應用程序,并使用autolayout我正在嘗試創建一個具有不同行高的表視圖 .原型單元的布局如下:我有一個主單元格(黑色)里面有一個UIView(紅色),里面有一個UILabel(藍色)我添加的Autolayout約束如圖所示:The UIView h…

php做一個微信退款,PHP實現微信退款功能

大家好,我是小編,最近在調微信退款接口,發現有許多坑,更大家分享一下① 要是在測試的時候,網頁提示 curl 58 說明 證書的路徑出現問題(這里要填物理路徑,也就是絕對路徑)②網頁提示curl 52 說明你的證書引入…

php顯示時間,php實現用已經過去多長時間的方式顯示時間

本文實例講述了php用已經過去多長時間的方式顯示時間的方法。分享給大家供大家參考。具體如下:這里以一種可讀性比較好的方式顯示已經過去多長時間,比如:距離現在10秒,距離現在1天等等。function time_is_older_than($t, $check_t…

java中日期計算時間差,java中依據,兩個日期,計算時間差

java中根據,兩個日期,計算時間差。分別獲取兩個時間的毫秒數Date.getTime(),相減,得到的值/1000為秒數,/60*1000為分鐘數,/60*60*1000為小時數。/*** 計算時間差** param begin* param end* return*/public…

php獲取token失敗,微信開發,老是獲取token失敗

微信開發,總是獲取token失敗$appid wx1aabc8673b8f103a;$appsecret 9aa99fc9db9bf1321c1afe05feb29b6c;$url "https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid$appid&secret$appsecret";$urlhttps://api.weixin.…

2008下php上傳文件崩潰,php – 當用戶反復嘗試上傳無效文件類型時,網站崩潰

我試圖理解錯誤……我有一個允許用戶上傳CSV的網絡應用程序.如果文件類型不是CSV,則不會發生任何操作,頁面只顯示“無效的文件類型”.如果用戶嘗試上載無效的文件類型并反復單擊觸發處理上載的PHP文件的按鈕,則PHP文件最終會無響應,并且網站崩潰時出現以下錯誤:&quo…

java錯誤1601解決方法,求助解決錯誤

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)at …