22 Mayıs 2019 Çarşamba

ProcessBuilder Sınıfı

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ı
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();
Redirect
Redirect işlemleri için şu satırı dahil ederiz.
import java.lang.ProcessBuilder.Redirect;
constructor - array
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.
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 metodu
Default 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 metodu
Komutun "working directory" dizinini belirtir.
File workingDir = new File("C:\\");
ProcessBuilder pb = new ProcessBuilder(...);
pb.directory(workingDir);
inheritIO metodu
Açı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 metodu
stderr 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 metodu
Process nesnesi döndürür. Şöyle yaparız.
ProcessBuilder pb = new ProcessBuilder(...);
Process process = pb.start();


Hiç yorum yok:

Yorum Gönder