阻止Java解析命令行参数

时间:2010-03-17 23:05:51

标签: java command-line

想在Java中进行一个不会自动解析命令行上使用的参数的应用程序。目前,java需要public static void main(string[])作为入口点签名。我想要一个我自己解析的字符串。这可以完成吗?

这是一个例子: java MyProgram Hello World

我希望它能给我Hello World而不需要围绕该字符串的引号。我甚至会满足于java给我整个java MyProgram Hello World。我认为这是Java以外的东西,而且与shell有很多关系。

7 个答案:

答案 0 :(得分:6)

你对shell部分是正确的。假设您使用的是Unix,那么您的Unix shell会将您的输入字符串拆分为空白,然后将每个部分作为输入到“main”的数组中的元素返回。将所有内容作为单个字符串输入的唯一方法是像这样引用它(你说你不想要):

java MyProgram 'Hello World'

如果您不想这样做,最简单的方法就是将它们重新组合成一个字符串:

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    for(String s : args) {
        sb.append(s);
        sb.append(" "); //some length of whitespace
    }

    String yourString = sb.toString().trim();
}

这里真正的问题是,如果你试图避免引用并自己重新组合输入字符串,那么你将失去每个单词之间的空白量。如果重新组合,则以下所有命令行:

java MyProgram Hello World
java MyProgram Hello    World
java MyProgram Hello                           World

仍会在您的程序中显示为“Hello World”。

答案 1 :(得分:1)

Java始终需要此签名。但是,您可以使用main方法中的参数构建单个字符串。

有关如何执行此操作的示例,请参阅this

答案 2 :(得分:1)

加入字符串:

class MyProgram {
    public static void main(String [] args ) {
        String commandLine = join( args );
        System.out.println(commandLine);
        // go on 
     }
     private static String join( String [] args ) {
         StringBuilder builder = new StringBuilder();
         for( String arg : args ) {
             builder.append( arg );
             builder.append( ' ' );
         } 
         builder.delete( builder.length()-1, builder.length());
         return builder.toString();
      }
}

输出:

output http://img443.imageshack.us/img443/2682/capturadepantalla201003v.png

答案 3 :(得分:1)

这比任何事情都更糟糕,并且正在从事物的另一方面解决问题,但是在bash中有一个名为IFS或内部字段分隔符的变量,它告诉shell如何考虑分隔符。如果要用IFS中的更改来结束读取,您可以获得与之相同的基本效果,尽管每次都需要手动输入数据。

只是一个建议,请在下面打击。

#!/bin/bash

IFS="
"

read TMP

java $1 \"$TMP\"

unset IFS

答案 4 :(得分:0)

快速和脏修复 - 只连接传入的所有参数。

答案 5 :(得分:0)

StringBuilder b = new StringBuilder();
for (string s : commandLineArgs) {
    b.append(s);
    b.append(" ");
}

// do what you want with b

答案 6 :(得分:0)

没有。解析命令行而不是shell的不是java。为了防止它,你必须引用输入。

java MyProgram "Hello World"