使用从java程序调用的Windows命令提示符,将具有多个连续空格的字符串作为参数传递给jar文件
我想使用在另一个java程序中调用的Windows命令提示符将带有多个连续空格的字符串作为参数传递给jar文件。 java文件是这样的,它打印所有参数:
package src; public class myClass { public static void main(String[] args) { for(int i = 0; i < args.length; i++) { System.out.println("args" + i+ ":" + args[i]); } } }
现在,这是我从另一个java程序调用上面的main方法并打印输出的方法:
package src; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class NewClass { public static void main(String[] args) throws IOException { Runtime rt = Runtime.getRuntime(); Process pr; String grmmClassPath ="C:\\Users\\XX\\Documents\\NetBeansProjects\\JavaApplication1\\dist\\JavaApplication1.jar"; String className = "src.myClass"; pr = rt.exec("cmd.exe /c java" + " -cp " + grmmClassPath + " " + className + " \"hello world\"" ); WriteProcessStream(pr); } public static void WriteProcessStream(Process pr) throws IOException { InputStreamReader isr = new InputStreamReader(pr.getInputStream()); String startLabel = ""; String endLabel = ""; BufferedReader br = new BufferedReader(isr); String line = null; System.out.println(startLabel); while ((line = br.readLine()) != null) { System.out.println(line); } System.out.println(endLabel); } }
所以当我运行上面的程序时,它打印:
arg 0 is: hello world
这正是问题所在! 我希望args [0]有三个空格,但是我做的任何东西,我都不能得到至少有两个连续空格的args [0]。
有趣的是,如果我直接从cmd.exe调用myClass的main方法,就像这样:
java -cp JavaApplication1.jar src.myClass "hello world"
我会得到以下输出:
arg 0 is:hello world
令人惊讶的是,它的空间已被保留!
如果有人能帮助我,我会很感激。
Necro但是:不要使用Runtime.exec(String)
重载。 根据javadoc (间接),它会在任何空格处对命令进行标记,忽略在您通过CMD(或Unix shell)直接输入此命令行时将应用的引用规则。 然后Windows执行程序从令牌重建命令行,丢失额外的空格。
而是使用String[]
重载和正确的解析:
p = runtime.exec(new String[]{"cmd","/c","java","-cp",classpath,classname,"hello world"});
或者你实际上并没有使用CMD的任何function,所以你不需要它:
p = runtime.exec(new String[]{"java","-cp",classpath,classname,"hello world"});
如果你使用ProcessBuilder
,它的ctor和.command(setter)
被声明为String...
(vararg),所以你可以只传递标记而不需要编写new String[]{...}
。
或者,运行CMD并将命令行作为输入 :
p = runtime.exec("cmd"); // or new ProcessBuilder + start String line = "java -cp " + classpath + " " + classname + " \"hello world\"\n"; p.getOutputStream.write(line.getBytes());
(对于这种方法,CMD的输出将包括输入的横幅,提示和回显。)