2017-03-18 25 views
-2

我希望程序中的某些代碼僅在用戶在命令行中輸入字符'*'作爲命令行參數時才能運行。這是我所使用的代碼: -java在args [0]中讀取「*」作爲.class文件

//myfile.java 
import java.io.*; 

public class myfile { 
    public static void main(String[] args) { 
     if(args[0].equals("*")){   
      //do stuff 
      System.out.println(args[0]);//added this line to see what exactly was being passed 
     } 
    } 
} 

,當該程序通過輸入在命令行下執行: -

java myfile * 

我期待看到屏幕上的輸出星號字符,而不是顯示的輸出是'myfile.class'。我哪裏錯了?爲什麼Java將星號更改爲.class文件? 另外,請注意,該程序完美執行前四次我執行它,然後開始這樣做!

在此先感謝您的幫助。

+7

你的shell會這樣做:它將*展開到當前目錄中的所有文件。 Java與它無關。 –

+1

像'java myfile'*''一樣運行你的程序。 – Siguza

+0

謝謝你的幫助! –

回答

1

命令終端已經替換星號和java已經得到你看到的值。我會使用任何其他字符,這對命令終端沒有特殊意義,否則你必須在命令中跳過星號。

實際上在Windows上特別是在cmd.exe中的轉義參數並不重要。這篇不錯的文章詳細解釋了這個問題:Everyone quotes command line arguments the wrong way
您的案例的拍賣是:圍繞星號用引號。

答案在評論你的問題:

使用轉義字符工作!但我還是不明白爲什麼它的工作沒有轉義字符前幾次

我不知道,但也許你遇到這樣的問題:它是否有差別,如果方式可以擴大或沒有。例如,當我通過Test*作爲參數,則有2個情況要考慮:

    在當前文件夾
  1. 有一個叫做Test1.txt文件:那麼你的Java程序將獲得Test1.txt作爲參數
  2. 當有沒有匹配的文件,你的程序將獲得Test*作爲參數

但是,我不知道,如何做到這一點適用於你的情況,因爲你只通過*:應當只在一個空目錄工作。

+0

謝謝!使用轉義字符工作!但我仍然不明白爲什麼它在沒有轉義字符的情況下最初幾次工作... :-( –

3

我哪裏錯了?

明星角色需要引用或轉義。運行Java程序是這樣的:

java myfile "*" 

java myfile \* 

爲什麼Java的改變星號.class文件?

它沒有。這是你的外殼正在做它。這是shell文件擴展......或者「globbing」,因爲它也被稱爲。

運行「ls *」或「echo *」,您將看到發生同樣的事情。

+0

謝謝!使用「*」工作。我使用windows(命令提示符),所以echo *和dir *似乎並沒有受到'globbing'的影響,但我絕對會查找它的,謝謝你的幫助! –

+0

啊,是的,在Windows上,通過應用程序而不是外殼來完成... ...不一致。 Windows不是一個很好的程序員平臺的另一個原因。) –

+0

我明白了!這也解釋了爲什麼程序在最初的幾次工作.... –