2011-03-20 112 views
23

怪異的行爲我有一個類像 -
與主要方法

public class Test{ 
    public static void main(String[] args){ 
     for(String s: args){ 
      System.out.println(s); 
     } 
    } 
} 

當我運行這個程序像>java Test *它打印該文件夾中的所有文件的名稱。
我不知道JVM或Windows是否通過這個數組而不是'*',我想知道這個程序在其他平臺(除Windows以外)上的行爲是否相同,以及它爲什麼以這種方式表現?這有什麼目的或理由嗎?

注意
它不會破壞我的任何代碼,但我只是好奇。

+0

+1,不是偏題。 – user7116 2011-03-21 18:41:46

回答

15

我原本以爲這只是執行文件名擴展的命令行shell。這就是我在類Unix系統下所期望的,但不是Windows ......但在Windows下也是如此。

不會發生在我編寫等效的C#代碼時...所以我懷疑它是在Java可執行文件啓動器中執行的。 (請注意,javaw.exe的行爲方式是相同的java.exe)

這肯定出乎我,我也沒想到較老版本的Java這樣做在Windows,但this mailing list post from December 2000建議我錯了。 (我使用的是OpenJDK 1.7 JRE。)

我在Java Windows documentation中找不到任何有關此一般情況的描述 - 它提到擴展類路徑條目,但不提供一般參數。

+0

是的..我嘗試使用java 5和java 6,它的行爲與我提到的完全相同。 – Premraj 2011-03-20 14:15:04

+4

我認爲他們正在模擬像Windows那樣的系統上的java加載器的'*'擴展,而通常的shell並不這麼做。 – 2011-03-20 14:18:48

+0

@Paŭlo:的確,是的。 – 2011-03-20 14:19:15

0

我覺得命令行首先解釋特殊的操作符,然後傳遞給java文件。

例如

java Test * > test.txt 

java Test Test.???? 
java Test^

我認爲它不是特定於java。

1

直到最近(我猜測在Java 6中)Java中增加了一項新功能,其中'*'被轉換爲當前目錄中的所有文件。這主要是爲了避免需要傳遞長類路徑,並提供獨立於平臺的方式將文件夾中的所有jar文件傳遞到類路徑。

java -cp "lib/*" <mainClass> 

LIB/*將tranlated由類路徑分離器,用於在該平臺(即:用於UNIX像和;用於視窗)分隔的文件的列表傳遞給-cp屬性。

我認爲這可能是您看到的行爲的原因。我認爲這只是爲了指定類路徑,但現在我認爲我錯了。