2017-03-18 6 views
-2

ユーザがコマンドライン引数として文字 '*'を入力した場合にのみ、プログラム内のコードを実行します。このプログラムは次のように入力して、コマンドラインで実行された場合Javaは.classファイルとしてargs [0]の "*"を読み込みます。

//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ファイルに変更するのはなぜですか? また、このプログラムは最初の4回は完璧に動作しましたが、私はそれを実行してからこれをやり始めました!

ご協力いただきありがとうございます。

+7

あなたのシェルはそれを行います:カレントディレクトリにあるすべてのファイルに*展開します。 Javaはそれとは関係ありません。 –

+1

'java myfile '*''のようなプログラムを実行してください。 – Siguza

+0

ご協力いただきありがとうございます! –

答えて

1

コマンドターミナルはすでにアスタリスクを置き換えており、javaはすでに表示されている値を取得しています。私はコマンド端末に特別な意味を持たない他の文字を使用します。そうしないと、コマンド中のアスタリスクをエスケープする必要があります。

実際には、Windows、特にcmd.exeの引数をエスケープするのは簡単ではありません。この素敵な記事で詳しく説明しています:Everyone quotes command line arguments the wrong way
あなたの場合のタカウェイは:アスタリスクを引用符で囲みます。コメントにあなたの質問に

回答:

エスケープ文字を使用して働いていました!私はまだそれがエスケープ文字なしで、最初の数回

を働い取得しない理由しかし、私はわからないけど、多分あなたは、この動作に遭遇:パターンが展開できるかどうそれは違いになります。現在のフォルダ内

  1. Test1.txtと呼ばれるファイルがある:私は渡すとき例えば、Test*は、引数として、その後2を検討する場合がある、あなたのJavaプログラムがある場合、引数
  2. としてTest1.txtを取得します唯一の空のディレクトリで作業するべきである:何の一致するファイルを、あなたのプログラムは、私はあなただけ*を渡すので、これは、あなたのケースに適用されます、どのようにわからない、

しかし引数としてTest*を取得しません。

+0

ありがとう!エスケープ文字を使って作業しました!しかし、私はまだ最初の数回はエスケープ文字なしで働いた理由を得ることはできません... :-( –

3

どこが間違っていますか?

スターの文字は引用またはエスケープする必要があります。このようなあなたのJavaプログラムを実行します。

java myfile "*" 

または

java myfile \* 

なぜJavaはの.classファイルにアスタリスクを変更するのですか?

これはありません。それはあなたのシェルです。これはシェルファイルの展開...または "globbing"とも呼ばれます。

「ls *」または「echo *」を実行すると、同じことが起こることがわかります。

+0

ありがとうございました! "*"を使用しました。私はウィンドウを使用しています(コマンドプロンプト) –

+0

ああ、Windows上では、globbingは...一貫していない...シェルではなくアプリケーションによって行われる。 Windowsがプログラマーのための良いプラットフォームではないもう一つの理由) –

+0

私はそれがなぜプログラムが最初の数回働いたのかを説明します.... –

関連する問題