Giriş
Java kullanarak bir başka uygulamayı çalıştırmak için Runtime.exec() veya ProcessBuilder sınıfını kullanmak lazım. Her iki sınıf ta Process nesnesi ürettiği için geri kalan işlemler aslında hemen hemen aynı.
Runtime Sınıfından Farkı
Redirect işlemleri için şu satırı dahil ederiz.
Açıklaması şöyle. Uygulamayı çalıştırmak için gereken tüm parametreleri bir array olarak alır. Parametreleri boşluk ile ayırmaya gerek kalmaz.
Komut satırından çalıştırılan bir uygulamamız olsun.
Eğer parametreleri array olarak geçmek istemiyorsak var arg olarak ta geçebiliriz.
Örnek
Default constructor ile kurulan nesneye çalıştırılacak komutu vermek için kullanılır. Şöyle yaparız.
Komutun "working directory" dizinini belirtir.
Açıklaması şöyle. Bu metod yerine redirectInput(), redirectOutput(), redirectError() çağrılarını Redirect.INHERIT parametresi ile teker teker yapmak gerekir.
Örnek
Çalıştırdığımız uygulamanı çıktısını almak için şöyle yaparız.
stderr akımını stdout akımına yönlendirir. Şöyle yaparız.
Örnek
start metodu ile uygulamayı başlatmakdan önce şöyle yaparız.
Örnek
Çalıştırdığımız uygulamanı çıktısını almak için şöyle yaparız.
Process nesnesi döndürür. Şöyle yaparız.
Java kullanarak bir başka uygulamayı çalıştırmak için Runtime.exec() veya ProcessBuilder sınıfını kullanmak lazım. Her iki sınıf ta Process nesnesi ürettiği için geri kalan işlemler aslında hemen hemen aynı.
Runtime Sınıfından Farkı
Bu sınıfın Runtime.exec()'ten en önemli farkı çalıştırılacak uygulama ve parametrelerini teker teker alması. Runtime.exec() şöyle kullanılır.
String command = "cmd.exe /c \"dir -d\"";
File workingDir = new File("C:\\");
String[] env = {};
Runtime.getRuntime().exec(command, env, workingDir);
Bu sınıf ise aşağıdaki constructor metodlarında görüldüğü gibi tüm parametreleri ayrı ayrı alır. Ayrıca sınıfı fluent kullanılmak üzere tasarlanmış.Process process = new ProcessBuilder(...)
.redirectOutput(...)
.redirectError(...)
.start();
RedirectRedirect işlemleri için şu satırı dahil ederiz.
import java.lang.ProcessBuilder.Redirect;
constructor - arrayAçıklaması şöyle. Uygulamayı çalıştırmak için gereken tüm parametreleri bir array olarak alır. Parametreleri boşluk ile ayırmaya gerek kalmaz.
The ProcessBuilder takes this list and uses each value contained in it to generate the command. Each value inside the command list is separated with spaces by the ProcessBuilder.Örnek
Komut satırından çalıştırılan bir uygulamamız olsun.
/usr/local/bin/ticketer/ticketer_robot "test" "testoce" "2 - Medium"
"/data/mars/logs/tesst.log" "test@test.com"
Aynısını kodla yapmak için şöyle yaparız.String[] command = {"/bin/bash",
"/usr/local/bin/ticketer/ticketer_robot",
"test",
"testoce",
"2 - Medium",
"/data/mars/logs/tesst.log",
"test@test.com"
};
ProcessBuilder pb = new ProcessBuilder (command);
constructor - vararg for Eğer parametreleri array olarak geçmek istemiyorsak var arg olarak ta geçebiliriz.
Örnek
Linux'ta kabuğu kullanmak için şöyle yaparız. Kabuk ile echo programı sudo uygulamasına şifreyi geçer.
new ProcessBuilder("/bin/sh", "-c", "echo <password> | sudo -S /opt/script.sh");
b.start();
Örnek
Windows'ta kabuğu kullanmak için şöyle yaparız.new ProcessBuilder ("cmd.exe", "/c", "dir -d")
command metoduDefault constructor ile kurulan nesneye çalıştırılacak komutu vermek için kullanılır. Şöyle yaparız.
File baseDir = new File("/home/test/work");
Process process = new ProcessBuilder()
.command("pwd")
.directory(baseDir)
.start();
directory metoduKomutun "working directory" dizinini belirtir.
File workingDir = new File("C:\\");
ProcessBuilder pb = new ProcessBuilder(...);
pb.directory(workingDir);
inheritIO metoduAçıklaması şöyle. Bu metod yerine redirectInput(), redirectOutput(), redirectError() çağrılarını Redirect.INHERIT parametresi ile teker teker yapmak gerekir.
he subprocess is started with its IO passing up to the process that executed it. This is required to see both any stdouts and stderrs it produces.redirectError metodu
Örnek
Çalıştırdığımız uygulamanı çıktısını almak için şöyle yaparız.
pb.redirectError (Redirect.INHERIT)
redirectErrorStream metodustderr akımını stdout akımına yönlendirir. Şöyle yaparız.
pb.redirectErrorStream (true)
redirectInput metoduÖrnek
start metodu ile uygulamayı başlatmakdan önce şöyle yaparız.
ProcessBuilder builder = new ProcessBuilder(...);
pb.redirectInput(Redirect.PIPE);
Daha sonra start() metodu ile uygulamayı başlatıp girdi sağlarız.Process process = pb.start();
BufferedWriter stdin = new BufferedWriter(
new OutputStreamWriter(process.getOutputStream(), StandardCharsets.US_ASCII));
stdin.write("help\n");
stdin.flush();
process.waitFor();
redirectOutput metoduÖrnek
Çalıştırdığımız uygulamanı çıktısını almak için şöyle yaparız.
pb.redirectOutput(Redirect.INHERIT);
start metoduProcess nesnesi döndürür. Şöyle yaparız.
ProcessBuilder pb = new ProcessBuilder(...);
Process process = pb.start();
Hiç yorum yok:
Yorum Gönder