想在Java中进行一个不会自动解析命令行上使用的参数的应用程序。目前,java需要public static void main(string[])
作为入口点签名。我想要一个我自己解析的字符串。这可以完成吗?
这是一个例子:
java MyProgram Hello World
我希望它能给我Hello World
而不需要围绕该字符串的引号。我甚至会满足于java给我整个java MyProgram Hello World
。我认为这是Java以外的东西,而且与shell有很多关系。
答案 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"