11 Nisan 2018 Ç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ı.

Redirect işlemleri için şu satırı dahil ederiz.
import java.lang.ProcessBuilder.Redirect;
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();

constructor - array
Uygulamayı çalıştırmak için gereken tüm parametreleri bir array olarak alır. 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);
redirectError metodu
Şö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
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
Şö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