Java创建进程Word文档格式.docx

上传人:b****1 文档编号:5828670 上传时间:2023-05-05 格式:DOCX 页数:21 大小:27.31KB
下载 相关 举报
Java创建进程Word文档格式.docx_第1页
第1页 / 共21页
Java创建进程Word文档格式.docx_第2页
第2页 / 共21页
Java创建进程Word文档格式.docx_第3页
第3页 / 共21页
Java创建进程Word文档格式.docx_第4页
第4页 / 共21页
Java创建进程Word文档格式.docx_第5页
第5页 / 共21页
Java创建进程Word文档格式.docx_第6页
第6页 / 共21页
Java创建进程Word文档格式.docx_第7页
第7页 / 共21页
Java创建进程Word文档格式.docx_第8页
第8页 / 共21页
Java创建进程Word文档格式.docx_第9页
第9页 / 共21页
Java创建进程Word文档格式.docx_第10页
第10页 / 共21页
Java创建进程Word文档格式.docx_第11页
第11页 / 共21页
Java创建进程Word文档格式.docx_第12页
第12页 / 共21页
Java创建进程Word文档格式.docx_第13页
第13页 / 共21页
Java创建进程Word文档格式.docx_第14页
第14页 / 共21页
Java创建进程Word文档格式.docx_第15页
第15页 / 共21页
Java创建进程Word文档格式.docx_第16页
第16页 / 共21页
Java创建进程Word文档格式.docx_第17页
第17页 / 共21页
Java创建进程Word文档格式.docx_第18页
第18页 / 共21页
Java创建进程Word文档格式.docx_第19页
第19页 / 共21页
Java创建进程Word文档格式.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Java创建进程Word文档格式.docx

《Java创建进程Word文档格式.docx》由会员分享,可在线阅读,更多相关《Java创建进程Word文档格式.docx(21页珍藏版)》请在冰点文库上搜索。

Java创建进程Word文档格式.docx

(1)使用Runtime的exec()方法 

(2)使用ProcessBuilder的start()方法 

2.1.1ProcessBuilder 

ProcessBuilder类是J2SE1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。

在J2SE1.5之前,都是由Process类处来实现进程的控制管理。

每个ProcessBuilder实例管理一个进程属性集。

start()方法利用这些属性创建一个新的Process实例。

start()方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。

每个进程生成器管理这些进程属性:

命令是一个字符串列表,它表示要调用的外部程序文件及其参数(如果有)。

在此,表示有效的操作系统命令的字符串列表是依赖于系统的。

例如,每一个总体变量,通常都要成为此列表中的元素,但有一些操作系统,希望程序能自己标记命令行字符串——在这种系统中,Java实现可能需要命令确切地包含这两个元素。

环境是从变量到值的依赖于系统的映射。

初始值是当前进程环境的一个副本(请参阅System.getenv())。

工作目录。

默认值是当前进程的当前工作目录,通常根据系统属性user.dir来命名。

redirectErrorStream属性。

最初,此属性为false,意思是子进程的标准输出和错误输出被发送给两个独立的流,这些流可以通过Process.getInputStream()和Process.getErrorStream()方法来访问。

如果将值设置为true,标准错误将与标准输出合并。

这使得关联错误消息和相应的输出变得更容易。

在此情况下,合并的数据可从Process.getInputStream()返回的流读取,而从Process.getErrorStream()返回的流读取将直接到达文件尾。

修改进程构建器的属性将影响后续由该对象的start()方法启动的进程,但从不会影响以前启动的进程或Java自身的进程。

大多数错误检查由start()方法执行。

可以修改对象的状态,但这样start()将会失败。

例如,将命令属性设置为一个空列表将不会抛出异常,除非包含了start()。

注意,此类不是同步的。

如果多个线程同时访问一个ProcessBuilder,而其中至少一个线程从结构上修改了其中一个属性,它必须保持外部同步。

Java代码 

1.构造方法摘要 

2.ProcessBuilder(List<

String>

command) 

3. 

利用指定的操作系统程序和参数构造一个进程生成器。

4.ProcessBuilder(String... 

5. 

6. 

7.方法摘要 

8. 

List<

command() 

9. 

返回此进程生成器的操作系统程序和参数。

10. 

ProcessBuilder 

command(List<

11. 

设置此进程生成器的操作系统程序和参数。

12. 

command(String... 

13. 

14. 

File 

directory() 

15. 

返回此进程生成器的工作目录。

16. 

directory(File 

directory) 

17. 

设置此进程生成器的工作目录。

18. 

Map<

String,String>

environment() 

19. 

返回此进程生成器环境的字符串映射视图。

20. 

boolean 

redirectErrorStream() 

21. 

通知进程生成器是否合并标准错误和标准输出。

22. 

redirectErrorStream(boolean 

redirectErrorStream) 

23. 

设置此进程生成器的 

redirectErrorStream 

属性。

24. 

Process 

start() 

25. 

使用此进程生成器的属性启动一个新进程。

2.1.2Runtime 

每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。

可以通过getRuntime方法获取当前运行时。

应用程序不能创建自己的Runtime类实例。

但可以通过getRuntime方法获取当前Runtime运行时对象的引用。

一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。

1.void 

addShutdownHook(Thread 

hook) 

2. 

注册新的虚拟机来关闭挂钩。

int 

availableProcessors() 

4. 

向 

Java 

虚拟机返回可用处理器的数目。

exec(String 

在单独的进程中执行指定的字符串命令。

7. 

exec(String[] 

cmdarray) 

在单独的进程中执行指定命令和变量。

cmdarray, 

String[] 

envp) 

在指定环境的独立进程中执行指定命令和变量。

envp, 

dir) 

在指定环境和工作目录的独立进程中执行指定的命令和变量。

command, 

在指定环境的单独进程中执行指定的字符串命令。

在有指定环境和工作目录的独立进程中执行指定的字符串命令。

void 

exit(int 

status) 

通过启动虚拟机的关闭序列,终止当前正在运行的 

虚拟机。

long 

freeMemory() 

返回 

虚拟机中的空闲内存量。

gc() 

运行垃圾回收器。

InputStream 

getLocalizedInputStream(InputStream 

in) 

已过时。

从 

JDK 

1.1 

开始,将本地编码字节流转换为 

Unicode 

字符流的首选方法是使用 

InputStreamReader 

和 

BufferedReader 

类。

OutputStream 

getLocalizedOutputStream(OutputStream 

out) 

26. 

开始,将 

字符流转换为本地编码字节流的首选方法是使用 

OutputStreamWriter、BufferedWriter 

PrintWriter 

27.static 

Runtime 

getRuntime() 

28. 

返回与当前 

应用程序相关的运行时对象。

29. 

halt(int 

30. 

强行终止目前正在运行的 

31. 

load(String 

filename) 

32. 

加载作为动态库的指定文件名。

33. 

loadLibrary(String 

libname) 

34. 

加载具有指定库名的动态库。

35. 

maxMemory() 

36. 

虚拟机试图使用的最大内存量。

37. 

removeShutdownHook(Thread 

38. 

取消注册某个先前已注册的虚拟机关闭挂钩。

39. 

runFinalization() 

40. 

运行挂起 

finalization 

的所有对象的终止方法。

41.static 

runFinalizersOnExit(boolean 

value) 

42. 

此方法本身具有不安全性。

它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。

43. 

totalMemory() 

44. 

虚拟机中的内存总量。

45. 

traceInstructions(boolean 

on) 

46. 

启用/禁用指令跟踪。

47. 

traceMethodCalls(boolean 

48. 

启用/禁用方法调用跟踪。

2.1.3Process 

不管通过那种方法启动进程后,都会返回一个Process类的实例代表启动的进程,该实例可用来控制进程并获得相关信息。

Process类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法:

destroy() 

杀掉子进程。

一般情况下,该方法并不能杀掉已经启动的进程,不用为好。

4.int 

exitValue() 

返回子进程的出口值。

只有启动的进程执行完成、或者由于异常退出后,exitValue()方法才会有正常的返回值,否则抛出异常。

7.InputStream 

getErrorStream() 

获取子进程的错误流。

如果错误输出被重定向,则不能从该流中读取错误输出。

10.InputStream 

getInputStream() 

获取子进程的输入流。

可以从该流中读取进程的标准输出。

13.OutputStream 

getOutputStream() 

获取子进程的输出流。

写入到该流中的数据作为进程的标准输入。

16.int 

waitFor() 

导致当前线程等待,如有必要,一直要等到由该 

对象表示的进程已经终止。

通过该类提供的方法,可以实现与启动的进程之间通信,达到交互的目的。

2.2实例 

2.2.1创建子进程 

要创建子进程可以通过使用使用ProcessBuilder的start()方法和Runtime的exec()方法。

(1)Runtime.exec() 

1.import 

java.io.BufferedReader;

2.import 

java.io.File;

3.import 

java.io.InputStreamReader;

5.public 

class 

Test1 

6.public 

static 

main(String[] 

args) 

try 

null;

String 

line 

stdout 

//list 

the 

files 

and 

directorys 

under 

C:

Runtime.getRuntime().exec("

CMD.exe 

/C 

dir"

 

null, 

new 

File("

\\"

));

BufferedReader(new 

InputStreamReader(p 

.getInputStream()));

while 

((line 

stdout.readLine()) 

!

null) 

System.out.println(line);

stdout.close();

//echo 

value 

of 

NAME 

echo 

%NAME%"

{"

NAME=TEST"

});

27. 

catch 

(Exception 

e) 

e.printStackTrace();

32.} 

(2)ProcessBuilder 

4.import 

java.util.ArrayList;

5.import 

java.util.List;

7.public 

Test2 

8.public 

list 

ArrayList<

();

pb 

list.add("

CMD.EXE"

);

/C"

ProcessBuilder(list);

pb.directory(new 

pb.start();

ProcessBuilder();

mand(new 

CMD.exe"

"

pb.environment().put("

NAME"

TEST"

41. 

46.} 

从启动其他程序的Java进程看,已启动的其他程序输出就是一个普通的输入流,可以通过getInputStream()和getErrorStream来获取。

对于一般输出文本的进程来说,可以将InputStream封装成BufferedReader,然后就可以一行一行的对进程的标准输出进行处理。

通常,一个程序/进程在执行结束后会向操作系统返回一个整数值,0一般代表执行成功,非0表示执行出现问题。

有两种方式可以用来获取进程的返回值。

一是利用waitFor(),该方法是阻塞的,执导进程执行完成后再返回。

该方法返回一个代表进程返回值的整数值。

另一个方法是调用exitValue()方法,该方法是非阻塞的,调用立即返回。

但是如果进程没有执行完成,则抛出异常。

2.2.2进程阻塞问题 

由Process代表的进程在某些平台上有时候并不能很好的工作,特别是在对代表进程的标准输入流、输出流和错误输出进行操作时,如果使用不慎,有可能导致进程阻塞,甚至死锁。

如果将以上事例中的从标准输出重读取信息的语句修改为从错误输出流中读取:

stdout=newBufferedReader(newInputStreamReader(p.getErrorStream()));

那么程序将发生阻塞,不能执行完成,而是hang在那里。

当进程启动后,就会打开标准输出流和错误输出流准备输出,当进程结束时,就会关闭他们。

在以上例子中,错误输出流没有数据要输出,标准输出流中有数据输出。

由于标准输出流中的数据没有被读取,进程就不会结束,错误输出流也就不会被关闭,因此在调用readLine()方法时,整个程序就会被阻塞。

为了解决这个问题,可以根据输出的实际先后,先读取标准输出流,然后读取错误输出流。

但是,很多时候不能很明确的知道输出的先后,特别是要操作标准输入的时候,情况就会更为复杂。

这时候可以采用线程来对标准输出、错误输出和标准输入进行分别处理,根据他们之间在业务逻辑上的关系决定读取那个流或者写入数据。

针对标准输出流和错误输出流所造成的问题,可以使用ProcessBuilder的redirectErrorStream()方法将他们合二为一,这时候只要读取标准输出的数据就可以了。

当在程序中使用Process的waitFor()方法时,特别是在读取之前调用waitFor()方法时,也有可能造成阻塞。

可以用线程的方法来解决这个问题,也可以在读取数据后,调用waitFor()方法等待程序结束。

总之,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2