使用从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的输出将包括输入的横幅,提示和回显。)