S-JIS[2008-07-30/2015-04-18]
Java�ŊO���R�}���h�i�v���Z�X�j�����s������@�ɂ��āB
���s�ł���̂����s�t�@�C���iWindows�ł����Ɗg���q��exe��bat���̃t�@�C���AUNIX�ł��������s����������t�@�C����sh�j�ł���A�R�}���h�v�����v�g���V�F�������ډ��߂���R�}���h�iWindows�ł�����DOS�̓����R�}���hdir��echo�j�����ڂ����s�ł��Ȃ��B
�R�}���h�i�O���v���Z�X�j�����s����ƁA���̃v���Z�X�͔��œ���������B
|
JDK1.4�܂ł́A�O���v���Z�X�̋N����Runtime�N���X���g���B
JDK1.5�ȍ~�ł��g���邪�AJDK1.5�ȍ~�ł�Runtime�̓�����ProcessBuilder���g���Ă���̂ŁA�f����ProcessBuilder���g�������悢�B
Runtime r = Runtime.getRuntime();
Process process = r.exec("java -version");
//Process�̎g��������q
�R�}���h�̕�����������t���i�X�y�[�X���j�œn���ƁA���̃R�}���h�����s�����B
�����AWindows�ł̓X�y�[�X����̃t�@�C������f�B���N�g�������g�����肷��̂ŁA���̏ꍇ�͕ςȏ��ŋ���邱�ƂɂȂ��Ă��܂��B
���������ꍇ�́A�z��`���œn���B
Runtime r = Runtime.getRuntime(); // Process process = r.exec(new String[]{ "java", "-version" }); Process process = r.exec(new String[] { "C:\\Program Files\\Java\\j2re1.4.2_13\\bin\\java", "-version" }); //Process�̎g��������q
Windows��echo���R�}���h�v�����v�g�����߂���R�}���h�Ȃ̂ŁA���ڎ��s���邱�Ƃ͏o���Ȃ��B�i���s���悤�Ƃ���Ɨ�O����������j
java.io.IOException: CreateProcess: echo zzz error=2
at java.lang.Win32Process.create(Native Method)
�����������̂́A�R�}���h�v�����v�g���N�����Ă��A���̏�Ŏ��s�ł���B�iWindowsXP�̏ꍇ�Acmd.exe���R�}���h�v�����v�g�{�́j
cmd��/c�I�v�V������t���Ď��s����� �R�}���h�����s������ɏI�����Ă����̂ŁA����𗘗p����B
Runtime r = Runtime.getRuntime(); Process process = r.exec("cmd /c echo zzz"); // Process process = r.exec(new String[]{ "cmd", "/c", "echo", "zzz" }); //Process�̎g��������q
���Ȃ݂�DOS�ł́A�X���b�V�����̃I�v�V�������X�y�[�X����ꂸ�Ɏw�肷�邱�Ƃ��o�����B
C:\> cmd/c echo zzz zzz
������Runtime#exec()�ł́A�����܂ŃX�y�[�X�ŋ��K�v������B
Runtime#exec()����2�����ɂ́A���ϐ����w�肷�邱�Ƃ��o����B
�ȗ�����null���w�肵���̂Ɠ�����ԂɂȂ��Ă���A���̏ꍇ�͎��s����JavaVM�Ɠ������ϐ����w�肳�ꂽ�����ɂȂ�B
�����Ŋ��ϐ����w�肷��ɂ́A�ȉ��̂悤�ɂ���B
String[] env = new String[2]; env[0] = "TEST=�T���v��"; env[1] = "PATH=" + System.getProperty("java.library.path"); Runtime r = Runtime.getRuntime(); Process process = r.exec("cmd /c echo %TEST%", env); //Process�̎g��������q
exec()�̑�2�����ɓn���̂́A�g�p������ϐ��S�āB
�ucmd /c�v�̏ꍇ�́A���ϐ�PATH���K�v�i�̂悤�Ȋ��G�j�Ȃ̂ŁA����������œ���Ă��K�v������B
�f�t�H���g�̊��ϐ���System#getenv("PATH")�Ƃ��������\�b�h�Ŏ擾���������������邪�AJDK1.4�ł�getenv()�͔����\�b�h�ł���A��������������������Ă��Ȃ��̂Ŏg���Ȃ��B
�i���ϐ�PATH�̏ꍇ��System.getProperty("java.library.path")�Ŏ擾�ł��邩��܂��������ǁc�j
����̗�ł́A
�R�}���h�iexec()�̑�1�����j�̒��Łu%TEST%�v�Ƃ����`���Ŋ��ϐ���W�J���Ă��邪�A����́ucmd�v������o���邱�ƁB�icmd.exe�����߂��Ă����j
�ujava %TEST%�v�Ƃ���Ă��W�J����Ȃ��̂Œ��ӁB�i�ucmd /c java %TEST%�v�Ȃ�j
Runtime#exec()����3�����ɂ́A���s���̃J�����g�f�B���N�g���[���w�肷�邱�Ƃ��o����B
�ȗ�����null���w�肵���̂Ɠ�����ԂɂȂ��Ă���A���̏ꍇ��JavaVM�̍�ƃf�B���N�g���[���w�肳���i���̂Ǝv����j�B
���Ȃ킿�ASystem.getProperty("user.dir")�Ŏ擾�ł���f�B���N�g���[�Ɠ����B
�����ŃJ�����g�f�B���N�g���[���w�肷��ɂ́A�ȉ��̂悤�ɂ���B
File dir = new File("C:/temp"); Runtime r = Runtime.getRuntime(); Process process = r.exec("cmd /c cd", null, dir); //Windows��cd�R�}���h�́A�J�����g�f�B���N�g���[��\������ //Process�̎g��������q
ProcessBuilder��JDK1.5�ŐV�݂��ꂽ�N���X�BRuntime�������ł͂��̃N���X���g�p����悤�ɂȂ����B
ProcessBuilder pb = new ProcessBuilder("java", "-version");
Process process = pb.start();
//Process�̎g��������q
ProcessBuilder pb = new ProcessBuilder();
pb.command("java", "-version");
Process process = pb.start();
//Process�̎g��������q
�������ϒ������ł���A�����ł��������w��ł���B
�i�t�ɁA��̕�������ɂ��炸��ƃR�}���h�E�I�v�V�������������Ƃ͏o���Ȃ��Ȃ����B���A����̓X�y�[�X����̃p�X�ɑΉ��ł��Ȃ�����A�ʂɗv��Ȃ����낤�j
���ɁA�ȉ��̂悤�ȏ��������o����B
ProcessBuilder pb = new ProcessBuilder(new String[] { "java", "-version" });
List<String> list = new ArrayList<String>(); list.add("java"); list.add("-version"); ProcessBuilder pb = new ProcessBuilder(list);
���̕ӂ��Runtime���g���ꍇ�Ɠ����ŁA�ucmd /c�v���ĂԂ����B
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "echo", "zzz");
Process process = pb.start();
//Process�̎g��������q
�Ǝ��̊��ϐ��́ARuntime��舵���₷���Ȃ����B
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "echo", "%TEST%");
Map<String, String> env = pb.environment(); //���ϐ����擾
env.put("TEST", "sample");
Process process = pb.start();
//Process�̎g��������q
ProcessBuilder#environment()�ɂ��A�f�t�H���g�̊��ϐ��S�Ă��擾�ł���B
�������������\�b�h�ŕԂ��}�b�v�́A�悭����p�^�[���ł͕ύX�s�\�i���邢�͕ύX���Ă����̃I�u�W�F�N�g�ɂ͉e�����Ȃ��j�Ȃ̂����AProcessBuilder�̏ꍇ�́A���������������ƌ��̃I�u�W�F�N�g�ɔ��f�����B
�Ȃ̂ł��̃}�b�v���g���āA�ꕔ�̊��ϐ���������������V�������ϐ���lj�������A���邢�͑S�č폜�iclear()�j�����肷�邱�Ƃ��o����B
���s���̍�ƃf�B���N�g���[�i�J�����g�f�B���N�g���[�j���w�肷��ɂ́A�ȉ��̂悤�ɂ���B
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "cd"); //Windows��cd�R�}���h�́A�J�����g�f�B���N�g���[��\������
File dir = new File("C:/temp");
pb.directory(dir);
Process process = pb.start();
//Process�̎g��������q
���s�����v���Z�X�̕W���o�͂�W���G���[�̓��e���擾���邱�Ƃ��ł���i��q�j�̂����A
ProcessBuilder�ł́A�W���G���[�ɏo�͂��ꂽ���̂�W���o�͂Ƀ}�[�W�i����/���_�C���N�g�j���A�W���o�͂���ǂݎ�邾���łǂ���̓��e���擾�ł���悤�ɂ��邱�Ƃ��\�B
ProcessBuilder pb = new ProcessBuilder("java", "-version");
pb.redirectErrorStream(true); //�f�t�H���g��false�F�}�[�W���Ȃ��i�W���o�͂ƕW���G���[�͕ʁX�j
Process process = pb.start();
//Process�̎g��������q
�W���o�͂ƕW���G���[�̓��e�����s���œ��荬����\���͂��邪�c
�ǂ��炩�����o�͂���Ȃ��ƕ������Ă���悤�ȏꍇ��A�o�͓��e�͖��Ȃ��Ƃ����悤�ȏꍇ�Ȃ�g���������邩���B
ProcessBuilder#start()�i���邢��Runtime#exec()�j�ɂ���� �ʃv���Z�X���N�����A���Ŏ��s�����B
�i����start()��exec()�̖߂�l�ł���jProcess���g�����Ƃɂ���āA�N�������v���Z�X�̎��s���ʂ��擾���邱�Ƃ��o����B
�N�������v���Z�X���I������̂�҂ɂ́A�ȉ��̂悤�ɂ���B
ProcessBuilder pb = new ProcessBuilder(�`);
Process process = pb.start();
int ret = process.waitFor();
System.out.println("�߂�l�F" + ret);
process.waitFor();
int ret = process.exitValue();
System.out.println("�߂�l�F" + ret);
�߂�l�́A�N�������v���Z�X�i�R�}���h�j�̖߂�l�i�I���R�[�h�j�B��ʓI�ɁA����I���Ȃ�0���Ԃ�B
�N�������v���Z�X���W���o�͂�W���G���[�ɏ��������e�́AInputStream����Ď擾���邱�Ƃ��o����B
Process process = pb.start(); �O�҂� process.waitFor(); InputStream is = process.getInputStream(); //�W���o�� printInputStream(is); InputStream es = process.getErrorStream(); //�W���G���[ printInputStream(es); ��҂� process.waitFor();
public static void printInputStream(InputStream is) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
for (;;) {
String line = br.readLine();
if (line == null) break;
System.out.println(line);
}
} finally {
br.close();
}
}
������InputStream���̂́A�v���Z�X�̏I���҂����O�ł��I�����ł��g�����Ƃ��o����B
�̂����A���̂܂܂ł���肭�s���Ȃ��P�[�X�������B
�l�I�ɂ́A�v���Z�X���I�����Ă���A�����ꂽ���e���������擾�������B�i�N�������v���Z�X�̕W�����͂ւ̃f�[�^�n���Ƃ��͋C�ɂ��Ȃ����炗�j
Process process = pb.start(); process.waitFor(); printInputStream(process.getInputStream()); printInputStream(process.getErrorStream());
�������A�ʃv���Z�X������o�͗ʂ������Ƃ��́A���̃v���O�����͎~�܂��Ă��܂��B
�i�����Ă݂������ł́A�o�͑��i�N�������v���Z�X�j���W���o��or�W���G���[�̂ǂ��炩��512�����i���Ԃ�UNICODE�iUTF16�j�Ȃ̂ŁA1024�o�C�g�j���ďo�͂����NG�j
�O���v���Z�X�͕W���o�́i��W���G���[�j�ɂ������݂����̂����A���̎��ł���Process��InputStream���o�b�t�@�[�T�C�Y�Ɍ��肪�����B
���������āA�f�[�^�ʂ����̃o�b�t�@�[���Ɏ��܂��Ă���Ԃ͂����̂����A�X�g���[������ǂݏo���Ă��Ȃ��ƃo�b�t�@�[������Ȃ��Ȃ��āA����ȏ�ǂݍ��߂Ȃ��Ȃ�B
InputStream���ǂݍ��߂Ȃ��ƁA�������ݑ��i�O���v���Z�X�j���u���b�L���O�i�ꎞ��~�j�����B���������āA���̃v���Z�X�͏I���ł��Ȃ����ƂɂȂ�B
�ł���L�̃v���O�����ł́A�v���Z�X�̏I���҂��iwaitFor()�j�����Ă��邾���ŁA���̊Ԃ�InputStream����ǂݍ��ޏ����͖����B
���������ĉi�v�Ƀo�b�t�@�[�͋��A�N�������v���Z�X���I�������A�i�v�҂����v���O������~��ԂɂȂ�B�i������f�b�h���b�N��ԁj
�ł́A�v���Z�X�I���҂�������O�ɓǂݍ��߂Α��v���B
Process process = pb.start(); printInputStream(process.getInputStream()); printInputStream(process.getErrorStream()); process.waitFor();
������A�W���G���[�ɂ������܂��ƁA������ԂɂȂ�B
��ɕW���o�͂��S�ė���܂Ń��[�v���Ă��邪�A���̊ԂɕW���G���[�ɏ�����ăo�b�t�@�[����t�ɂȂ�ƁA�O���v���Z�X�̓u���b�L���O�����B
����ƕW���o�͂ɂ�����ȏ�f�[�^�͓f����Ȃ��Ȃ�A�҂���Ԃɓ����Ă��܂��B
���Ⴀ�ǂݍ��ݑ��ŁAInputStream��ErrorStream�����݂ɓǂނ悤�ɂ��Ă݂邩�B
public static void print2(InputStream is, InputStream es) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
BufferedReader er = new BufferedReader(new InputStreamReader(es));
try {
boolean b = true, e = true;
while (b || e) {
String line = br.readLine(); //�W���o�͂���ǂݍ���
if (line != null) {
System.out.println(line);
b = true;
} else {
b = false;
}
line = er.readLine(); //�W���G���[����ǂݍ���
if (line != null) {
System.err.println(line);
e = true;
} else {
e = false;
}
}
} finally {
try {
br.close();
} finally {
er.close();
}
}
}
Process process = pb.start(); print2(process.getInputStream(), process.getErrorStream()); process.waitFor();
����������ł��A�_���ȃP�[�X������B
�W�����͂ƕW���G���[�����݂ɏo�͂���Ă���Ȃ炱��ł������A�ǂ��炩�Е����o�͂���Ȃ��ƁA������readLine()�����͑҂��ɓ����Ă��܂��B
�܂��A���s�����ő�ʂ̃f�[�^�������ꍇ��readLine()�Ŏ~�܂��Ă��܂��͗l�B
readLine()==null�Ƃ�������łȂ�ready()���g���A�O�҂ɑ��Ă͉����ł��邩�H
public static void print2_(InputStream is, InputStream es) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
BufferedReader er = new BufferedReader(new InputStreamReader(es));
try {
boolean b = true, e = true;
while (b || e) {
if (br.ready()) {
String line = br.readLine();
if (line != null) {
System.out.println(line);
b = true;
} else {
b = false;
}
}
if (er.ready()) {
String line = er.readLine();
if (line != null) {
System.err.println(line);
e = true;
} else {
e = false;
}
}
}
} finally {
try {
br.close();
} finally {
er.close();
}
}
}
����Ŋm���ɑS�f�[�^�͓ǂ߂�悤�ɂȂ������A�������A�v���Z�X���I���������Ƃf�ł��Ȃ��āA����܂��i�v�҂��ɂȂ��Ă��܂��B
�iready()�́A�f�[�^��������i�v���Z�X���I�����Ă��Ă��H�j�f����false��Ԃ��B�܂�ŏI�I�ɂ͏��false�Ȃ̂Ńt���O���N���A����^�C�~���O�������A�I���ł��Ȃ��B
�ubr.ready()��er.ready()�o����false��������I���v�Ƃ������[�v�����ɂ�����c�f�[�^�������Ƃ�Ȃ������u�Ԃ�����A���̎��_�Ń��[�v���I�����Ă��܂�(���)�j
�����̖��͕W���G���[�ƕW���o�͂��ʁX�Ɏ擾���悤�Ƃ��邩��N�����̂ł����āA�ǂ��炩�����f�[�^���o�͂���Ȃ��Ȃ�A�����炾�����擾���邱�ƂŁA���͔������Ȃ��B
ProcessBuilder�Ȃ��W���G���[��W���o�͂Ƀ��_�C���N�g���Ă��܂��̂��ЂƂ̉������@���낤�B
�o�͓��e���̂ĂĂƂɂ����v���Z�X�I����҂Ȃ�A�ȉ��̂悤�ȃv���O�����ł��������B
ProcessBuilder pb = new ProcessBuilder(�`); pb.redirectErrorStream(true); // �W���G���[��W���o�͂Ƀ}�[�W���� Process process = pb.start(); InputStream is = process.getInputStream(); try { while(is.read() >= 0); //�W���o�͂����ǂݍ��߂悢 } finally { is.close(); } // process.waitFor(); System.out.println("�߂�l�F" + process.exitValue());
���̏ꍇ�AwaitFor()�ő҂K�v�͖����B�Ȃ��Ȃ�Ais.read()��-1��Ԃ��̂̓X�g���[�����N���[�Y���ꂽ�ꍇ�̂݁B���Ȃ킿�A�N�������v���Z�X���I���������Ƃ��Ӗ����邩��B
�Ƃ�����ŁA�W���o�́E�W���G���[�̓��e�������Ƃ��~�����̂ł���A��Ԋm���Ȃ̂́A�W���o�́E�W���G���[����̓ǂݍ��݂��X���b�h�����Ă��܂����@��������Ȃ��B
import java.io.*;
import java.util.*;
/**
* InputStream��ǂݍ��ރX���b�h
*/
public class InputStreamThread extends Thread {
private BufferedReader br;
private List<String> list = new ArrayList<String>();
/** �R���X�g���N�^�[ */
public InputStreamThread(InputStream is) {
br = new BufferedReader(new InputStreamReader(is));
}
/** �R���X�g���N�^�[ */
public InputStreamThread(InputStream is, String charset) {
try {
br = new BufferedReader(new InputStreamReader(is, charset));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
@Override
public void run() {
try {
for (;;) {
String line = br.readLine();
if (line == null) break;
list.add(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/** ������擾 */
public List<String> getStringList() {
return list;
}
}
Process process = pb.start(); //InputStream�̃X���b�h�J�n InputStreamThread it = new InputStreamThread(process.getInputStream()); InputStreamThread et = new InputStreamThread(process.getErrorStream()); it.start(); et.start(); //�v���Z�X�̏I���҂� process.waitFor(); //InputStream�̃X���b�h�I���҂� it.join(); et.join(); System.out.println("�߂�l�F" + process.exitValue()); //�W���o�͂̓��e���o�� for (String s : it.getStringList()) { System.out.println(s); } //�W���G���[�̓��e���o�� for (String s : et.getStringList()) { System.err.println(s); }
���̕��@�Ȃ�A�W���o�͗p��br.readLine()���u���b�L���O����Ă��A�ʃX���b�h�ŕW���G���[�p��br.readLine()�����������̂Ŗ��Ȃ��B
�܂��A���s���ăv���Z�X�I���҂��iprocess.waitFor()�j�����s����Ă���̂ŁA�N�������v���Z�X���I��������AInputStream���I������B
�����br.readLine()��null��Ԃ��̂ŁA�X���b�h�������ɏI������B
�ꉞ�^�C�����O�͂��邩������Ȃ��̂ŁAThread#join()���g���ăX���b�h�̏I���҂����s���B
��Buffered�n��BufferedReader��BufferedInputStream���g���ƁA�N�������v���Z�X�ɂ���Ă͒�~���Ȃ��Ȃ邱�Ƃ������炵���̂Œ��ӁB[2015-04-18]
�W���o�́E�W���G���[���X���b�h�œǂݍ��ޕ��@�̌��_�́A����u�X���b�h���g�p����v���ƁB
�Ⴆ��WebLogic8.1�ł̓A�v���P�[�V�������X���b�h�����邱�Ƃ�������Ă��Ȃ��̂ŁA�v���Z�X�N�����ɃX���b�h���N�������@�͎g���Ȃ��B
�����������́A�W���o�́E�W���G���[�̓��e�� �t�@�C���Ƀ��_�C���N�g���Ă��܂����@���l������B
��������v���Z�X���N�������A�v������InputStream�ɂ͉����n���Ă��Ȃ��̂ŁA�u���b�N���ǂ������Ƃ�����肩���������B
��DOS�̃��_�C���N�V�����EUNIX�̃��_�C���N�V����
//�_���ȗ�1
ProcessBuilder pb = new ProcessBuilder("javac", "-version", ">", "c:/t.txt");
//�_���ȗ�2
ProcessBuilder pb = new ProcessBuilder("javac", "-version", "> c:/t.txt");
���_�C���N�g�̋L���̂���Łu>�v�����Ă��A�����P�ɃR�}���h�̈����Ƃ��ĉ��߂���Ă��܂��B
���_�C���N�g�̏����̓R�}���h�v�����v�g���s���i�Ǝv����j�̂ŁA�����cmd.exe����Ă��K�v������B
//�W���o�́E�W���G���[���Ƀt�@�C���֏o�͂��Ă��܂��� ProcessBuilder pb = new ProcessBuilder( "cmd", "/c", "javac", "-help", ">", "c:/temp/stdout.txt", "2>", "c:/temp/stderr.txt" ); Process process = pb.start(); //�W���o�́E�W���G���[�̃X�g���[����ǂݍ��ޕK�v�͖��� int ret = process.waitFor(); System.out.println("�߂�l" + ret);
//�S�ĕW���o�͂֓�������� �c�f����redirectErrorStream()���g���ׂ����Ǝv����^^;
ProcessBuilder pb = new ProcessBuilder(
"cmd", "/c",
"javac", "-help",
"2>&1"
);
Process process = pb.start();
printInputStream(process.getInputStream()); //�W���o�͂����ǂݍ���
int ret = process.waitFor();
System.out.println("�߂�l" + ret);
//�W���G���[�����t�@�C���֏o�͂����
ProcessBuilder pb = new ProcessBuilder("javac", "-help");
//���s�������R�}���h�̑O��ɁA�R�}���h�v�����v�g�N����ݒ�
List<String> clist = pb.command();
clist.add(0, "cmd");
clist.add(1, "/c");
clist.add("2>>"); //�W���G���[�������t�@�C���֒lj��o��(append)
clist.add("c:/temp/log.txt");
Process process = pb.start();
printInputStream(process.getInputStream()); //�W���o�͂����ǂݍ���
int ret = process.waitFor();
System.out.println("�߂�l" + ret);
Process#getInputStream()�EgetErrorStream()�Ŏ擾�����X�g���[����A��������b�v����BufferedReader�́A�g���I�������N���[�Y���ׂ��Ȃ̂͊m���B[2010-12-26]
�����������I�ɃN���[�Y���Ȃ��Ă��A����ȂɊQ�͖����Ǝv����B
�܂��A���b�v���Ă���BufferedReader�EInputStreamReader��InputStream���o�b�t�@�����O���Ă��邾���Ȃ̂ŁA�g���Ȃ��Ȃ�����GC�ʼn������邩����ɖ��Ȃ��i�Ƃ͌����Ă������I�ɃN���[�Y���ׂ��ł͂��邪�j�B
Process����擾�����W���o�́E�W���G���[�̃X�g���[���́A�����Ńt�@�C���f�B�X�N���v�^�[���i���Ԃ�OS����擾���āj�g���Ă���̂ŁA�N���[�Y���Ȃ������烊�\�[�X�̌͊����ɂȂ邾�낤�B
�������ʂɃN���[�Y���Ȃ��Ă��AProcess�C���X�^���X��GC�ʼn�������ۂɃt�@�C�i���C�U�[�ŃN���[�Y�����B
�܂��A����܂ł̗�ł͕\�����Ďg���Ă��Ȃ�����ǁAProcess#getOutputStream()�Ŏ擾�ł���X�g���[�����AProcess�����ł̓I�[�v������Ă���B
���������Ă�����N���[�Y���ׂ������A�����I�Ɏ擾���ăN���[�Y���Ȃ�����́A�t�@�C�i���C�U�[�ŃN���[�Y�����B
�igetInputStream()�����擾����getErrorStream()���擾���Ȃ��ꍇ�����l�j
���ǂ̓t�@�C�i���C�U�[�őS�Ă��N���[�Y�����̂ŁA�ʂɃN���[�Y���Ȃ��Ă��A�ŏI�I�ɂ͖��Ȃ��ƍl������B
�i�������[���L��]���Ă���GC���S�����s����Ȃ��ƁA�t�@�C���f�B�X�N���v�^�[���������Ȃ��ă��\�[�X���͊�����\���͍l�����邪(���)�j
�i���Ƀt�@�C�i���C�U�[�����s����Ȃ��̂́A�v���O���������ڏI������ꍇ�B���̏ꍇ�͂��Ԃ�m�ۂ����t�@�C���f�B�X�N���v�^�[�͑S�ĉ�������Ǝv���B�������ɍ��ǂ���JavaVM�������Ń��[�N����Ƃ͎v���Ȃ��O�O�G�j
������{����Process�N���X���̂�close()������Έ�Ԃ����Ǝv������ǁA�����̂Ŏd���Ȃ��B
���Ȃ݂Ƀt�@�C�i���C�U�[Process#finalize()��protected�Ȃ̂ŁA�O�����疾���I�ɌĂяo�����Ƃ͏o���Ȃ��B
Process#waitFor()�́A�v���Z�X���I������܂Ŗ����ɑ҂B
��莞�Ԃ����҂��^�C���A�E�g�t��waitFor��JDK1.8�œ������ꂽ���A[2014-03-19]
JDK1.8���O��������A
�v���Z�X�������I��������ɂ�Process#destroy()���Ăяo���悢�̂ŁA�������^�C�}�[���N�����āA��莞�Ԍ��destroy()���邵���Ȃ��悤���B
class class ProcessDestroyer extends TimerTask {
private Process process;
public ProcessDestroyer(Process process) {
this.process = process;
}
@Override
public void run() {
process.destroy(); //�v���Z�X�������I��
}
}
ProcessBuilder pb = new ProcessBuilder("calc"); //Windows�́u�d��v
Process process = pb.start();
TimerTask task = new ProcessDestroyer(p);
Timer timer = new Timer("�v���Z�X��~�^�C�}�[");
timer.schedule(task, TimeUnit.SECONDS.toMillis(3)); //3�b���ProcessDestroyer#run()�����
for (;;) {
try {
process.waitFor(); //�v���Z�X�̏I���҂�
break;
} catch (InterruptedException e) {
e.printStackTrace();
//waitFor()��InterruptedException����������\�������邪�A
//����̗�ł́A���̏ꍇ���v���Z�X�̏I���҂����J��Ԃ��B
//�i�v���Z�X�̋����I����InterruptedException�͖��W�j
}
}
timer.cancel(); //�^�C�}�[�̃L�����Z���i�K�{�j
System.out.println("�߂�l�F" + process.exitValue());
WindowsXP�̏ꍇ�Adestroy()�ɂ�鋭���I���͖߂�l��1�ɂȂ�悤���B�i��O����������킯�ł͂Ȃ��j
���Ȃ݂ɁA�J���Ă���E�B���h�E�i���̗�Ō����u�d��v�j���^�X�N�}�l�[�W������u�v���Z�X�̏I���v�ŋ����I��������ƁA������1���Ԃ��Ă����B
�^�C�}�[�iTimer�N���X�j���g���ă^�C���A�E�g��������@�͗��ɓK���Ă���Ǝv������ǂ��A��͂��X���b�h���g���_��������ƃl�b�N�B
�D�L�����ǁAexitValue()���g���ă|�[�����O����Ƃ������@������悤���B�iJDK1.7�ȑO�j
exitValue()�̓v���Z�X�̖߂�l��Ԃ����\�b�h�����A�v���Z�X���I�����Ă��Ȃ��Ɨ�O����������B�Ȃ̂ŁA��O�̗L���ł����ăv���Z�X���I���������ǂ�������ł���B
Process process = pb.start(); long begin = System.currentTimeMillis(); // System.out.println(new Date(begin)); for (;;) { try { Thread.sleep(100); } catch (InterruptedException e) {} try { process.exitValue(); } catch (IllegalThreadStateException e) { //exitValue()�Ńv���Z�X���I�����Ă��Ȃ��� ���̗�O���������� long now = System.currentTimeMillis(); if (TimeUnit.MILLISECONDS.toSeconds(now - begin) < 10) { //10�b�ȏ�o�߂������ǂ��� continue; //for���[�v���J��Ԃ� } // System.out.println("�^�C���A�E�g�I" + new Date(now)); process.destroy(); //�v���Z�X�������I�� break; //for���[�v���� } // System.out.println("����I��"); break; //for���[�v���� }
JDK1.8�ł�isAlive()�Ƃ������\�b�h���lj����ꂽ�̂ŁA�|�[�����O����Ȃ炻������g���������ǂ����낤�B[2014-03-19]
JDK1.8�ł�isAlive()�Ƃ������\�b�h���lj����ꂽ�̂ŁA�iexitValue()�̑���Ɂj������g���Ĕ��肷�邱�Ƃ��o����B[2014-03-19]
Process process = pb.start();
long begin = System.currentTimeMillis()();
for (;;) {
try { Thread.sleep(100); } catch (InterruptedException e) {}
if (!process.isAlive()) {
System.out.println("����I�� " + process.exitValue());
break; // for���[�v����
}
long now = System.currentTimeMillis()();
if (TimeUnit.MILLISECONDS.toSeconds(now - begin) >= 10) { // 10�b�ȏ�o�߂������ǂ���
System.out.println("�^�C���A�E�g�I" + new Date(now));
process.destroy(); // �v���Z�X�������I��
break; // for���[�v����
}
}
���AisAlive()���g���ă|�[�����O������A�^�C���A�E�g�t����waitFor()���g�������f�R�ǂ����낤�B
JDK1.5�œ������ꂽFuture���g���ƁAFuture�̃^�C���A�E�g�@�\���g�����Ƃ��o����B[2014-03-18]
ProcessTask task = new ProcessTask();
ExecutorService pool = Executors.newSingleThreadExecutor();
try {
Future<Integer> future = pool.submit(task);
int exitValue = future.get(10, TimeUnit.SECONDS); //10�b�Ń^�C���A�E�g
System.out.println(exitValue);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
} finally {
pool.shutdownNow();
}
class ProcessTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
ProcessBuilder pb = new ProcessBuilder(�`);
Process process = pb.start();
try {
process.waitFor();
return process.exitValue();
} catch (Exception e) {
System.out.println(e.getClass() + "\t" + e.getMessage());
process.destroy(); // �v���Z�X�������I��
throw e;
}
}
}
Callable��Process�����s����^�X�N���쐬���AExecutorService�Ŏ��s�isubmit�j����B
submit�����Future���Ԃ��Ă���̂ŁA����ɑ��ă^�C���A�E�g�t����get()���Ăяo���B
Future���^�C���A�E�g����ƁAget()����TimeoutException���X���[�����̂ŁA������L���b�`���ă^�C���A�E�g�������s���悢�B
����Ƃ͕ʂɁAFuture�Ń^�C���A�E�g�����Callable�����Ŏ��s���Ă���process.waitFor()��InterruptedException����������B
������process.destroy()���Ă�ł����Ȃ��ƁAProcess���g�͏I�����Ȃ��̂Œ��ӁB
JDK1.8����A�^�C���A�E�g���Ԃ��w��ł���waitFor���\�b�h���lj����ꂽ�B[2014-03-19]
Process process = pb.start();
boolean end = process.waitFor(10, TimeUnit.SECONDS); //10�b�Ń^�C���A�E�g
if (end) {
System.out.println("����I�� " + process.exitValue());
} else {
System.out.println("�^�C���A�E�g");
process.destroy(); // �v���Z�X�������I��
}
�^�C���A�E�g�w���waitFor�ł́A�߂�l��true�������琳��I���Afalse��������^�C���A�E�g�B
�^�C���A�E�g�����ۂɃv���Z�X�������I�����������Ȃ�A������process.destroy()���Ăяo���K�v������B
�@
�@
�@
�@
�@
�@
�@
�@
�@
�@
�@
�@
�@
�@
�@
�@