Process process = Runtime.getRuntime().exec("tasklist");
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
process.waitFor();
Run Code Online (Sandbox Code Playgroud) 我正在找出一种从Java调用exe并传入特定参数的机制.我能怎么做?
Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe").start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:", Arrays.toString(args));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
Run Code Online (Sandbox Code Playgroud)
以前的代码有效.但是我无法传递参数.MyExe.exe接受参数.另一个问题是PathToExe有空格.ProcessBuilder似乎无法正常工作.例如:
C:\\User\\My applications\\MyExe.exe
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有一组在tomcat下运行的webapps.使用-Xmx参数将Tomcat配置为具有多达2 GB的内存.
许多Web应用程序需要执行最终使用以下代码的任务:
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
process.waitFor();
...
Run Code Online (Sandbox Code Playgroud)
我们遇到的问题与在Linux上创建这个"子进程"的方式有关(Redhat 4.4和Centos 5.4).
我的理解是,等于tomcat使用量的内存量需要在物理(非交换)系统内存池中自由,最初才能创建此子进程.当我们没有足够的免费物理内存时,我们得到了这个:
java.io.IOException: error=12, Cannot allocate memory
at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 28 more
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1) 是否可以删除与物理内存中空闲进程相等的内存量的要求? 我正在寻找一个答案,允许我指定子进程获取多少内存或允许java上的java访问交换内存.
2) 如果没有#1的解决方案,Runtime.getRuntime().exec()有哪些替代方案? 我只能想到两个,这两个都不是很理想.JNI(非常不可取)或重写我们在java中调用的程序,并使其成为webapp以某种方式与之通信的自己的进程.必须有其他人.
3) 这个问题的另一面是否有可能解决这个问题? 降低tomcat使用的内存量不是一种选择.增加服务器上的内存总是一种选择,但似乎更像是一个创可贴.
服务器正在运行java 6.
编辑:我应该指定我不是在寻找特定于tomcat的修复程序.我们在网络服务器上运行的任何java应用程序都可以看到这个问题(有多个).我只是使用tomcat作为一个例子,因为它很可能会分配最多的内存,而这正是我们第一次看到错误的地方.这是一个可重现的错误.
编辑:最后,我们通过重写系统调用在java中执行的操作来解决此问题.我觉得我们很幸运能够在不进行额外系统调用的情况下完成此操作.并非所有流程都能够做到这一点,所以我仍然希望看到一个实际的解决方案.
我在网上搜索过,找不到合适的答案.我知道如何将文件读入java进行读取或操作,甚至如何删除文件,但我不知道如何执行外部文件(存储在用户的系统中).
例如,如果我在用户的系统上有一个书籍列表及其位置.我希望当用户点击特定按钮时,在相关软件中打开特定位置的pdf或文档,例如adobe文档阅读器或单词等.
我该怎么做呢?