Process class

Javaからシェルコマンドを利用できたら、さぞかし便利だろうと思うわけですが、そういうことはもちろんできます。java.lang.Process クラスを使えばいいので、OSの種類ぐらいは判別して動作を確認できるサンプルプログラムを作成してみました。プロセスを起動しているので、速度的に問題があるわけですが、これでは満足できない場合はJNIとかを検討するのがよろしかろうかという感じです。

package org.sssg.soft.sample.runtime;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class RuntimeTest {
class RunnableReader implements Runnable {
private Process p = null;
private BufferedReader reader = null;
private BufferedWriter writer = null;
private List message =
Collections.synchronizedList(new LinkedList());
public RunnableReader(Process p, String type) {
this.p = p;
if (“STDOUT”.equals(type)) {
reader = new BufferedReader(
new InputStreamReader(p.getInputStream()));
writer = new BufferedWriter(
new OutputStreamWriter(System.out));
} else if (“STDERR”.equals(type)) {
reader = new BufferedReader(
new InputStreamReader(p.getErrorStream()));
writer = new BufferedWriter(
new OutputStreamWriter(System.err));
}
}
public void run() {
if (reader == null || writer == null) {
return;
}
String line = “”;
try {
while ((line = reader.readLine()) != null) {
message.add(line);
writer.write(line);
writer.newLine();
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public List getMessages() {
return message;
}
}
public void run(String command) {
String[] commands = new String[1];
commands[0] = command;
run(commands);
}
public void run(String[] commands) {
Process p = null;
try {
p = Runtime.getRuntime().exec(commands);
BufferedReader reader =
new BufferedReader(
new InputStreamReader(p.getInputStream()));
Thread stdoutReader = new Thread(new RunnableReader(p, “STDOUT”));
Thread stderrReader = new Thread(new RunnableReader(p, “STDERR”));
stdoutReader.start();
stderrReader.start();
try {
p.waitFor();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
int exitValue = p.exitValue();
System.out.println(exitValue);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String osName = System.getProperty(“os.name”);
String command;
String[] commands;
String[] errorCommands;
if (osName.startsWith(“Win”)) {
command = “ipconfig”;
String[] winCommands = { “cmd”, “/c”, “dir”, “/w” };
commands = winCommands;
String[] winErrorCommands = { “cmd”, “/c”, “dir”, “foo” };
errorCommands = winErrorCommands;
} else {
command = “ls”;
String[] linuxCommands = { “ls”, “-l” };
commands = linuxCommands;
String[] linuxErrorCommands = { “ls”, “foo” };
errorCommands = linuxErrorCommands;
}
RuntimeTest rt = new RuntimeTest();
rt.run(command);
rt.run(commands);
rt.run(errorCommands);
}
}

同じカテゴリの記事: Java