2010-03-17 125 views
1

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

下面是一个例子: java MyProgram Hello World

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

+0

java MyProgram。类不工作,除非你的类被命名为'类'和你的包'MyProgram''可能你打算'Java MyProgram' – OscarRyz 2010-03-17 23:09:54

+0

@Oscar,好点。我做了这个改变。 – User1 2010-03-18 13:57:56

回答

6

您即将外壳部分正确。假设你使用的是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”的程序中。

+0

这会丢失空格字符。 – middus 2010-03-17 23:14:05

+0

是的,我发帖后看到了,谢谢!不幸的是,没有办法在命令行中不引用空格的情况下忠实地重新创建空格。 – 2010-03-17 23:16:52

+2

在Windows上,整个命令行(至少是命令之后的位)可用于进程('GetCommandLine',IIRC),然后与另一个OS调用进行解析。在UNIX上,shell会解释命令行,因此进程根本看不到它。 – 2010-03-17 23:17:52

1

Java总是需要这个签名。不过,您可以从main方法中的参数构建单个字符串。

请参阅this了解如何执行此操作的示例。

0

快速和肮脏的修复 - 正好连接了在传递的所有参数

+0

在他的例子中连接是不够的,你需要在两者之间的空格。 – middus 2010-03-17 23:13:30

+0

如果引用了一些参数,它仍然不够。 – dan04 2010-03-18 03:03:11

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

// do what you want with b 
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

0

号这不是Java的多数民众赞成在解析命令行时但外壳。为了防止它,你必须引用输入。

java MyProgram "Hello World" 
1

这更是一个黑客比什么和正在处理从事情的另一面的问题,但没有在bash称为IFS或内部磁场分离器告诉shell什么考虑分隔符的变量。如果有人在IFS中改变了阅读方式,你可以获得相同的基本效果,尽管每次都需要手动输入数据。

只是一个建议,bash下面。

#!/bin/bash 

IFS=" 
" 

read TMP 

java $1 \"$TMP\" 

unset IFS