Java外部執行作業系統命令(Java 建立本地系統進程)

來源:互聯網
上載者:User

Java外部執行作業系統命令  Java 建立本地系統進程

Java線程機制、Process、ProcessBuilder,對啟用的進程in/out/error資訊進行記錄

層級: 初級

王延成 (ybygjy@gmail.com)

2010 年 4 月 13 日(整理)

此文章內容主要描述了Java Process、ProcessBuilder類的使用,在使用中遇到的問題處理。

在我們web應用中,有幾個地方需要用到本地系統進程來處理,如:

  • 使用Process啟用系統的某個服務
  • 定時執行檔案格式轉換
  • 應用程式自動重啟
  • 執行系統定時備份,Database Backup

當然,使用java執行本地系統應用程式也只是我們解決問題的一種辦法,我們也可以使用別的手段來解決。

要注意的小細節
·本地系統內容變數

    配置本地系統內容變數的目的就是能讓Java VM 找的到外部應用程式,我們一定都還記得java環境變數怎麼配置吧?。在配置完環境變數後,我們就可以在建立系統進程時指定java vm 去哪裡找作業系統命令(具體見代碼)。

·監聽進程執行過程中的標準/異常輸出

回頁首

程式碼範例

這段程式碼封裝含在基於FlashPaper的文檔唯讀文檔所和代碼中.

import java.io.File;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.nio.ByteBuffer;<br />import java.nio.channels.Channels;<br />import java.nio.channels.ReadableByteChannel;<br />import java.util.ArrayList;<br />import java.util.List;<br />import java.util.Map;</p><p>import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;</p><p>import com.hd.sy.util.doc.FileConvert;<br />import com.hd.util.HDException;<br />/**<br /> * 檔案轉換swf格式支援<br /> * @author WangYanCheng<br /> * @version 2009-12-3<br /> */<br />public class FileConvert4SwfImpl implements FileConvert {<br /> /**轉換完成後的檔案名稱*/<br /> private File fileInst = null;<br /> /**輸出目錄*/<br /> private File outFolder = null;<br /> /**<br /> * {@inheritDoc}<br /> * 需要驗證fileInst是否為空白<br /> */<br /> public File doConvertFile(File inputFileInst, File outFilePath) throws HDException {<br /> new InnerConvertThread(inputFileInst, outFilePath);<br /> return fileInst;<br /> }<br /> /**<br /> * {@inheritDoc}<br /> * 需要驗證fileInst是否為空白<br /> */<br /> public File doConvertFile(File inputFileInst) throws HDException {<br /> new InnerConvertThread(inputFileInst, null);<br /> return fileInst;<br /> }<br /> /**<br /> * setOutFolder<br /> * @param setOutFolder setOutFolder<br /> */<br /> public void setOutFolder(File setOutFolder) {<br /> this.outFolder = setOutFolder;<br /> }<br /> /**<br /> * {@inheritDoc}<br /> */<br /> public String getCommand() {<br /> return defaultCommand;<br /> }<br /> /**<br /> * {@inheritDoc}<br /> */<br /> public void setCommand(String tmpCommand) {<br /> this.defaultCommand = tmpCommand;<br /> }<br /> /**default command*/<br /> private String defaultCommand = "FlashPrinter.exe";<br /> /**<br /> * InnerConvert<br /> * @author WangYanCheng<br /> * @version 2009-12-4<br /> */<br /> class InnerConvertThread implements Runnable {<br /> /**inputFile*/<br /> private File inFile = null;<br /> /**outFilePath*/<br /> private File outFile = new File(System.getProperty("java.io.tmpdir"));<br /> /**<br /> * Constructor<br /> * @param inFileObj inFileObj<br /> * @param outFilePath outFilePath<br /> */<br /> public InnerConvertThread(File inFileObj, File outFilePath) {<br /> this.inFile = inFileObj;<br /> this.outFile = outFilePath == null ? outFolder : outFilePath;<br /> Thread th = new Thread(this);<br /> //th.setDaemon(true);<br /> th.start();<br /> }<br /> /**<br /> * Constructor<br /> * @param setInFile input file to set<br /> * @param setOutFolder output Folder to set<br /> */<br /> public InnerConvertThread(String setInFile, String setOutFolder) {<br /> this.inFile = new File(setInFile);<br /> this.outFile = null == setOutFolder ? outFile : new File(setOutFolder);<br /> new InnerConvertThread(inFile, outFile);<br /> }<br /> /**<br /> * {@inheritDoc}<br /> */<br /> public void run() {<br /> String tmpOutFile = outFile.getPath()<br /> .concat(File.separator).concat(inFile.getName().replaceAll("[.]{1}.*$", ".swf"));<br /> fileInst = new File(tmpOutFile);<br /> List commandArray = new ArrayList();<br /> commandArray.add(defaultCommand);<br /> commandArray.add(inFile.getPath());<br /> commandArray.add("-o");<br /> commandArray.add(tmpOutFile);<br /> ProcessBuilder pbObj = new ProcessBuilder();<br /> pbObj.command(commandArray);<br /> Map envMap = pbObj.environment();<br /> envMap.clear();<br /> envMap.putAll(System.getenv());<br /> pbObj.directory(outFile);<br /> pbObj.redirectErrorStream(true);<br /> try {<br /> Process proObj = pbObj.start();<br /> final InputStream ins = proObj.getInputStream();<br /> final ByteBuffer byteBuffer = ByteBuffer.allocate(1024);<br /> Thread th = new Thread() {<br /> public void run() {<br /> ReadableByteChannel rbcObj = Channels.newChannel(ins);<br /> while(true){<br /> try {<br /> while (rbcObj.read(byteBuffer) != -1) {<br /> byteBuffer.flip();<br /> logger.info(java.nio.charset.Charset.defaultCharset().decode(byteBuffer));<br /> byteBuffer.clear();<br /> }<br /> } catch (IOException e) {<br /> logger.error(e);<br /> }<br /> }<br /> }<br /> };<br /> th.setDaemon(true);<br /> th.start();<br /> try {<br /> proObj.waitFor();<br /> logger.error("轉換完成." + tmpOutFile);<br /> } catch (InterruptedException e) {<br /> logger.error(e);<br /> }<br /> } catch (IOException e) {<br /> logger.error(e);<br /> }<br /> }<br /> }<br /> /**<br /> * 測試入口<br /> * @param args 參數列表<br /> */<br /> public static void main(String[] args) {<br /> File inputFileInst = new File("D://work//workspace//mywork//src//org//ybygjy//file//cv2Swf//file//servlet-2_3-fcs-spec.pdf"),<br /> outputFileInst = new File("D://work//workspace//mywork//src//org//ybygjy//file//cv2Swf//file//");<br /> FileConvert fc = new FileConvert4SwfImpl();<br /> try {<br /> fc.doConvertFile(inputFileInst, outputFileInst);<br /> } catch (HDException e) {<br /> e.printStackTrace();<br /> }<br /> }<br /> /**logger*/<br /> private Log logger = LogFactory.getLog(FileConvert4SwfImpl.class);<br />}<br />

回首頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.