在本文中,我们将带你了解Linux上的JavaRuntime.exec在这篇文章中,我们将为您详细介绍Linux上的JavaRuntime.exec的方方面面,并解答参数常见的疑惑,同时我们还将给您一
在本文中,我们将带你了解Linux上的Java Runtime.exec在这篇文章中,我们将为您详细介绍Linux上的Java Runtime.exec的方方面面,并解答参数常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Java process.getRuntime()exec()从不停止工作、Java Runtime exec()无法正确转义字符、Java Runtime.exec在Linux上遇到了麻烦、Java Runtime.exec()。
本文目录一览:- Linux上的Java Runtime.exec()参数(linux java运行)
- Java process.getRuntime()exec()从不停止工作
- Java Runtime exec()无法正确转义字符
- Java Runtime.exec在Linux上遇到了麻烦
- Java Runtime.exec()
Linux上的Java Runtime.exec()参数(linux java运行)
好的,这就是问题所在:我有3个类MyClass1和MyClass2和ExecClass。我转到命令提示符并执行以下操作:
$java MyClass1 -exec "java MyClass2 arg1 arg2"
完美地运作。现在在ExecClass中,我有以下几行:
Runtime.getRuntime().exec("java MyClass1 -exec \"java MyClass2 arg1 arg2\"");
问题是,如果您打印第二个字符串,它与第一个字符串完全相同,但是当我的ExecClass运行它时,MyClass1会抱怨:无法识别的参数arg1失败。经过一些调试后,我发现在第一种情况下,当我直接从终端调用时,引号中的整个字符串是1个参数(arg
[1]),在第二种情况下,arg.length =
5且它基本上将它们分割了…出于某种未知的原因。我只需要知道一个工作环境,如果有人知道,也可以运行我的Runtime.exec()即可。PS:在我的Windows计算机上,这种问题仅在linux上不会发生。这是一个Ubuntu破坏内核:2.6.32-279.14.1.el6.x86_64。
答案1
小编典典Runtime.exec
与system()
其他语言中的类似函数不同,它不会调用外壳程序来解析命令(并且双引号字符串是外壳程序功能)。
要以所需方式拆分字符串,请使用接受String数组的Runtime.exec:
Runtime.getRuntime().exec(new String[] { "java", "MyClass1", "-exec", "java MyClass2 arg1 arg2"});
Java process.getRuntime()exec()从不停止工作
如果您的python与8问题的工作方式相同,则可以尝试读取其他Thread
中的输入流。
赞:
...
new Thread(new Runnable(){
@Override
public void run(){
BufferedReader stdInput = new BufferedReader(newInputStreamReader(p.getInputStream()));
String temp ="";
while((temp = stdInput.readLine()) != null) {
System.out.println(temp);
}}).start();
Java Runtime exec()无法正确转义字符
这可能之前已经被回答过了,但是那是关于unicode的,我不认为这是unicode(它是ASCII的。。。)。
当我在终端中执行此操作时,没有任何问题
vboxmanage setextradata "Test Machine" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort" 2222
但是当我在Java中使用以下内容时
Runtime.getRuntime().exec("vboxmanage setextradata \"Test Machine\" \"VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort\" 2222");
它返回错误:未注册的vm’“ TestMachine”’
对于其中带有空格的参数(例如Test \ Machine),也是如此,然后它不会转义空格。
现在我认为这与字符编码有关,但是我看不到设置该o_O的任何选项
答案1
小编典典您正在一次调用该程序及其参数,这有效地将整个字符串推入了处理环境(希望达到最佳效果)。
在Windows系统中,操作系统着重于以不同的方式处理可执行文件和参数,并将它们全部放在同一字符串中只是要求您选择环境(我知道其中有两个)可以重新使用的理想字符串。
-parse进入参数列表。更好的解决方案是使用
Runtime.exec(new String[] {"vboxmanage", "setextradata", "Test Machine", "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort", "2222"});
对应于 Runtime''s
public Process exec(String[] cmdarray) throws IOException
充其量,使用一个字符串方法,您最终将找到如何提示和转义参数,以免将它们视为可执行文件名称的一部分,但是随后您将遇到一个新问题,即它们被传递了。全部作为可执行文件的一个参数。一旦根据环境修复了该问题,您要么会发现自己的引号没有从参数中剥离(导致出现诸如“
2222”之类的参数),要么发现Window的半连续参数解析将首先在空白处进行解析(导致出现诸如(“
Test)之类的参数。这没有意义,这就是为什么有不止一种exec
方法可用的原因。
Java Runtime.exec在Linux上遇到了麻烦
大家好.我正在开发一个Java程序,用于在Linux环境中使用,该环境创建一个运行另一个java类的新Java进程,但我遇到了麻烦.我终于解决了所有问题.调用
Runtime.getRuntime().exec(new String[] { "/bin/bash","-c","'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" })
在我的Java程序中返回
/bin/bash: /usr/lib/jvm/java-6-openjdk/jre/bin/java -classpath /home/kevin/workspace/Misc/bin HelloWorld: No such file or directory
在stdout / stderr中.如果我试试
Runtime.getRuntime().exec(new String[] { "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" })
我得到一个Java异常
Cannot run program "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'": java.io.IOException: error=2,No such file or directory
...
Caused by: java.io.IOException: java.io.IOException: error=2,No such file or directory
最后,使用简单
Runtime.getRuntime().exec("/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'")
给了我一个
-classpath: -c: line 0: unexpected EOF while looking for matching `''
-classpath: -c: line 1: Syntax error: unexpected end of file
来自stdout / stderr.
同时,创建一个新的一行.sh文件(并分配适当的权限)只有这个(文件顶部没有#!/ bin / bash)
/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'
给出正确的输出而没有错误.
我知道Runtime.exec的用法非常复杂,而且我已经解决了之前从中得到的一些大问题,但这个问题让我感到很困惑(例如Runtime.exec使用StringTokenizer搞砸任何有空格的命令在它们中,这就是我调用接受String数组的重载的原因).但是,我仍然遇到问题,我不明白为什么.
Runtime.getRuntime().exec(new String[] { "/bin/bash","java -classpath /home/kevin/workspace/Misc/bin HelloWorld" })
您不需要额外的引用,因为传递单个String参数会自动引用它.
Java Runtime.exec()
我可以从命令行运行此命令而不会出现任何问题(验证脚本会执行):
c:/Python27/python ../feedvalidator/feedvalidator/src/demo.py https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators
从java,如果我离开URL参数,只是做:
String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" };Runtime r = Runtime.getRuntime();Process p = r.exec(args1);
它工作正常。如果我对某些参数使用某些URL,例如:
String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" , "http://www.intertwingly.net/blog/index.atom"};// or String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" , "http://www.cnn.com"};
它也可以正常工作。
但是,如果我使用这个特定的URL
https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators,那么脚本只会挂起(java等待过程完成)。我不确定为什么它可以从该URL的命令行运行,而不是从Java程序运行。我尝试添加引号将URL参数括起来,但这也不起作用。我认为URL中没有任何需要转义的字符。
完整代码:
String urlToValidate = "https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators";String[] args1 = {"c:/Python27/python", "C:/Documents and Settings/vhaiswcaldej/DAS_Workspace/feedvalidator/feedvalidator/src/demo.py", urlToValidate };System.out.println(args1[0] + " " + args1[1] + " " + args1[2]);Runtime r = Runtime.getRuntime();Process p = r.exec(args1);BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));int returnCode = p.waitFor(); System.out.println("Python Script or OS Return Code: " + Integer.toString(returnCode));if (returnCode >= 2) { .out.println("OS Error: Unable to Find File or other OS error."); }String line = "";while (br.ready()) { String str = br.readLine(); System.out.println(str); if (str.startsWith("line")) { //TODO: Report this error back to test tool. //System.out.println("Error!"); } }
答案1
小编典典您需要耗尽进程的输出和错误流,否则当执行的程序产生输出时,它将阻塞。
从流程文档中:
由于某些本机平台仅为标准输入和输出流提供了有限的缓冲区大小,因此未能及时写入子流程的输入流或读取子流程的输出流可能导致子流程阻塞甚至死锁。
我们今天的关于Linux上的Java Runtime.exec和参数的分享已经告一段落,感谢您的关注,如果您想了解更多关于Java process.getRuntime()exec()从不停止工作、Java Runtime exec()无法正确转义字符、Java Runtime.exec在Linux上遇到了麻烦、Java Runtime.exec()的相关信息,请在本站查询。
本文标签: