2010-03-17 173 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