package Ġpw . jon ak Ċ Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . Buffered Writer Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠLa unches Ġthe Ġgiven Ġ[ executable Name ] Ġwith Ġthe Ġgiven Ġ[ arguments ], Ċ Ġ* Ġin Ġthe Ġoptionally - given Ġ[ working Directory ]. ĠCapt ures Ġstdin / stdout / stderr , Ċ Ġ* Ġoptionally Ġredirect ing Ġthem Ġto Ġtheir Ġgiven Ġfiles . Ċ Ġ*/ Ċ class ĠSub process ( ĊĠĠĠ Ġexecutable Name : ĠString , ĊĠĠĠ Ġprivate Ġvar arg Ġval Ġarguments : ĠString , ĊĠĠĠ Ġoutput Redirect : ĠFile ? Ġ= Ġnull , ĊĠĠĠ Ġinput Redirect : ĠFile ? Ġ= Ġnull , ĊĠĠĠ Ġerror Redirect : ĠFile ? Ġ= Ġnull , ĊĠĠĠ Ġworking Directory : ĠString ? Ġ= Ġnull Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġexecutable : ĠFile ĊĠĠĠ Ġprivate Ġval Ġprocess : ĠProcess ĊĊĠĠĠ Ġ/** ĠDirect Ġaccess Ġto Ġthe Ġprocess 's Ġstdout . Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġstdout : ĠBufferedReader ĊĠĠĠ Ġ/** ĠDirect Ġaccess Ġto Ġthe Ġprocess 's Ġstdin . Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġstdin : ĠBuffered Writer ĊĠĠĠ Ġ/** ĠDirect Ġaccess Ġto Ġthe Ġprocess 's Ġstderr . Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġstderr : ĠBufferedReader ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutable Ġ= Ġsearch For Executable In Path ( executable Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠFileNotFoundException (" Could Ġnot Ġfind Ġ$ executable Name ") ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠProcess Builder ( executable . absolute Path , Ġ* arguments ) ĊĠĠĠĠĠĠĠ Ġif Ġ( working Directory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . directory ( File ( working Directory )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( output Redirect Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . redirect Output ( output Redirect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( input Redirect Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . redirect Input ( input Redirect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( error Redirect Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . redirect Error ( error Redirect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprocess Ġ= Ġbuilder . start () ĊĠĠĠĠĠĠĠ Ġstdout Ġ= Ġprocess . inputStream . buffered Reader () ĊĠĠĠĠĠĠĠ Ġstdin Ġ= Ġprocess . output Stream . buffered Writer () ĊĠĠĠĠĠĠĠ Ġstderr Ġ= Ġprocess . error Stream . buffered Reader () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠEx poses Ġthe Ġprocess ' Ġexit Ġvalue Ġas Ġa Ġproperty . Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġexit Code : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprocess . exit Value () ĊĊĠĠĠ Ġ/** ĠEx poses Ġwhether Ġthis Ġprogram Ġis Ġrunning Ġor Ġnot . Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġalive : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprocess . is Alive ĊĊĠĠĠ Ġ/** ĠBlocks Ġuntil Ġthe Ġprocess Ġfinishes , Ġoptionally Ġup Ġto Ġ[ timeout ] Ġseconds . Ġ*/ ĊĠĠĠ Ġpublic Ġfun ĠwaitFor Completion ( timeout : ĠLong ? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( timeout Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . waitFor ( timeout , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . waitFor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠTermin ates Ġ( option ally , Ġfor c ibly ) Ġthis Ġsubprocess . Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġterminate ( force : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( force ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . destroy For c ibly () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ( static Ġmembers ) Ġ*/ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠMaps Ġexecutable Ġnames Ġto Ġthe Ġfull Ġpath Ġfound , Ġso Ġthat Ġwe Ġdon 't Ġneed Ġto Ġsearch Ġagain . Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠConcurrent HashMap < String , ĠString >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĠOn Ġwindows Ġespecially , Ġexecutable Ġnames Ġare Ġresolved Ġwith Ġan Ġimplicit Ġextension . Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEXEC UT ABLE _ EXTENSION S Ġ= ĠlistOf (". exe ", Ġ". bat ", Ġ". cmd ", Ġ"", Ġ". sh ") ĊĊĠĠĠĠĠĠĠ Ġ/** ĠLoc ates Ġthe Ġgiven Ġ[ executable ] Ġin Ġthe Ġcurrent Ġdirectory Ġor ĠPATH , Ġand Ġreturns Ġa Ġrepresentative ĠFile Ġobject . Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsearch For Executable In Path ( executable : ĠString ): ĠFile ? Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache . containsKey ( executable )) Ġreturn ĠFile ( cache [ executable ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Path Ġ= Ġ( System . getenv (" PATH ") ?. split ( File . path Separator ) Ġ?: Ġreturn Ġnull ) Ġ+ Ġ"." ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġsearch Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( extension Ġin ĠEXEC UT ABLE _ EXTENSION S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path , Ġexecutable Ġ+ Ġextension ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isFile Ġ&& Ġfile . can Execute ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache [ executable ] Ġ= Ġfile . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }