S-JIS[2008-07-30/2015-04-18]

�O���v���Z�X�N��

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


Runtime

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

�ujava -version�v�����s�����

	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

�uecho zzz�v�����s�����

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


�‹��ϐ��̎w��

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


�J�����g�f�B���N�g���[�̎w��

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

ProcessBuilder��JDK1.5�ŐV�݂��ꂽ�N���X�BRuntime�������ł͂��̃N���X���g�p����悤�ɂȂ����B

�ujava -version�v�����s�����

	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);

�uecho zzz�v�����s�����

���̕ӂ��Runtime���g���ꍇ�Ɠ����ŁA�ucmd /c�v���ĂԂ����B

	ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "echo", "zzz");
	Process process = pb.start();
	//Process�̎g��������q

�‹��ϐ��̎w��

�Ǝ��̊‹��ϐ��́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


�J�����g�f�B���N�g���[�̎w��

���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

�W���G���[�́A�W���o�͂ւ̃}�[�W

���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


Process

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

�v���Z�X�̏I���҂�

�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


�W���o�́E�W���G���[�̓ǂݍ���

�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


�ォ��ǂݍ��ނƑʖڂȗ��R

�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


��ɓǂݍ��ނƑʖڂȗ��R

�ł́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


�f�[�^��S�Ď̂ċ����Ă��悢�ꍇ�̉�����

�����̖��͕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


�ǂݍ��݂̃X���b�h��

�Ƃ�����Ł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]


���_�C���N�V�����̗��p

�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);

�X�g���[���̃N���[�Y�ɂ‚���

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


�v���Z�X�̋����I���i�^�C���A�E�g�j

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


exitValue()�𗘗p�����^�C���A�E�g

�^�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]


isAlive()�𗘗p�����^�C���A�E�g

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


Future�𗘗p�����^�C���A�E�g

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


�^�C���A�E�g�t��waitFor

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


Java�ڎ��֖߂� / �V�@�\�֖߂� / �Z�p�����֖߂�
���[���̑��M��F�Ђ�����

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@