说明
有时候我们使用java程序的时候需要启动程序或者命令,就可以使用进程类来实现启动外部进程。
例如exe,bat,shell文件或者脚本。
ProcessBuilder.start()
Runtime.exec()
Runtime.exec()
可接受一个单独的字符串,这个字符串是通过空格来分隔可执行命令程序和参数的,也可以接受字符串数组参数。
ProcessBuilder.start()
只能接收字符串列表或者字符串集合。列表中第一个参数是可执行命令程序,其他的是命令行执行是需要的参数。
ProcessBuilder.start()
和
Runtime.exec()
方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例
Process类
Java中的Process类是一个抽象类,它表示由操作系统执行的进程。
Process类提供了访问底层操作系统进程的方法和属性。当你在Java程序中创建一个进程(比如通过执行一个系统命令),Java虚拟机会返回一个Process对象的实例,你可以通过这个对象来获取进程的相关信息或控制进程。
Process类提供的主要方法和属性:
获取进程ID(PID):
int getPid(): 返回与此进程关联的本地进程ID。这个方法在Unix系统上有效,但在Windows系统上可能返回0或不支持。
获取进程的退出值:
int exitValue(): 获取进程的退出值。在进程正常运行结束之前调用此方法会导致IllegalThreadStateException。退出值为0通常表示进程成功执行。
销毁进程:
void destroy(): 强制终止进程。在销毁进程之前,调用destroy()方法的线程会尝试正常终止该进程及其所有子进程。如果进程不能终止,该线程会放弃进一步的尝试。
等待进程结束:
int waitFor(): 导致当前线程等待,直到由Process对象表示的进程终止。这个方法返回一个整数,该整数是进程的正常退出值。
int waitFor(long timeout, TimeUnit unit): 导致当前线程等待,直到由Process对象表示的进程终止或超过指定的等待时间。如果在超时前进程终止,则返回进程的退出值;如果超时,则返回0。
获取进程的输入流、输出流和错误流:
InputStream getInputStream(): 获取进程的常规输出流(标准输出)。
OutputStream getOutputStream(): 获取进程的输入流(标准输入)。
InputStream getErrorStream(): 获取进程的错误输出流(标准错误)。
获取进程的环境信息:
Map<String, String> getEnvironment(): 返回与此进程相关的环境变量。这个方法通常返回一个不可修改的映射。
获取进程的类加载器:
ClassLoader getClassLoader(): 返回启动进程的类加载器。这对于了解进程的上下文环境可能很有用。
Process类在Java中主要被用于执行外部程序或脚本,并与它们进行交互。
请注意,处理Process对象时,特别是在读取输出流和错误流时,通常需要确保及时消耗这些流的内容,以避免缓冲区满导致进程挂起。
Runtime.exec()
String
sourceFilePath
=
tempFile.toString();
String
targetServer
=
String.format(
"%s:%s:home/ubuntu/images%s"
, host, port, path);
String
rsyncOptions
=
"-vzrtopg --progress --delete "
;
String
command
=
String.format(
"rsync %s %s %s"
, rsyncOptions, sourceFilePath, targetServer);
try
{
Process
process
=
Runtime.getRuntime().exec(command);
BufferedReader
reader
=
new
BufferedReader
(
new
InputStreamReader
(process.getInputStream()));
String line;
while
((line = reader.readLine()) !=
null
) {
System.out.println(line);
int
exitCode
=
process.waitFor();
System.out.println(
"Rsync exited with code: "
+ exitCode);
return
true
;
}
catch
(IOException | InterruptedException e) {
e.printStackTrace();
return
false
;
ProcessBuilder.start()
String
sourceFilePath
=
tempFile.toString();
String
targetServer
=
String.format(
"%s:%s/home/ubuntu/images%s"
, host, port, path);
String
rsyncOptions1
=
"-vzrtopg"
;
String
rsyncOptions2
=
"--progress"
;
String
rsyncOptions3
=
"--delete"
;
ProcessBuilder
processBuilder
=
new
ProcessBuilder
(
"rsync"
, rsyncOptions1,rsyncOptions2,rsyncOptions3, sourceFilePath, targetServer);
processBuilder.redirectErrorStream(
true
);
try
{
Process
process
=
processBuilder.start();
BufferedReader
reader
=
new
BufferedReader
(
new
InputStreamReader
(process.getInputStream()));
String line;
while
((line = reader.readLine()) !=
null
) {
System.out.println(line);
int
exitCode
=
process.waitFor();
System.out.println(
"Rsync exited with code: "
+ exitCode);
Files.delete(tempFile);
return
exitCode ==
0
;
}
catch
(IOException | InterruptedException e) {
e.printStackTrace();
return
false
;