- ベストアンサー
コマンドライン引数のワイルドカード指定
以下のように、Javaで作成したプログラムを起動するとします。 >java sample *.java このとき、カレントディレクトリの拡張子が".java"というファイル N個をmain関数の引数に渡すようなことは可能でしょうか? わかりにくい質問で申し訳ありません。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ns18さん>私の持っている本には載っていませんでしたし。。。 むぅ、そうですか、ありませんでしたか。 Java2SDKをインストールしたときにドキュメントも一緒にインストールされますが、その中に引数について書かれたドキュメントも含まれています。 SUNのサイトだと以下にあります。 http://java.sun.com/products/jdk/1.2/ja/docs/ja/tooldocs/win32/java.html http://java.sun.com/products/jdk/1.2/ja/docs/ja/tooldocs/solaris/java.html ↓トップからだと見つけにくいかもしれませんが。 http://java.sun.com/products/jdk/1.2/ja/ ↑なお、「1.2」のところはJavaのバージョンなので、「1.3」とか「1.4」とかすれば、それぞれのバージョンのドキュメントが見れます。 Harry_さん>Windowsでやってもちゃんと展開されてしまいました。 大概のOSでは、ワイルドカードを使えば、勝手に展開してくれます。 "*"を使えば任意の文字列になりますし、"?"なら任意の一文字という具合にです。 ただ、ファイルが存在しない場合には展開できないので、単なる"*.java"という文字列として渡ります。 いずれにせよ、引数で渡ってきたファイルが存在するか存在しないかは、自分でチェックして判断しなければなりません。 例えば、ファイルとしては存在していない"nothing.java"という文字列を引数で指定した場合、引数で渡されたファイル名と思われる文字列に該当するファイルが実際に存在するか否かは、Fileクラスを使ってチェックしなければなりません。 その文字列に該当するファイルが存在しないのであれば、その引数は単なる文字列だった、ということになります。 参考まで。
その他の回答 (7)
- a-kuma
- ベストアンサー率50% (1122/2211)
もう一度確認してみました。前回は、寝ぼけていたようです。ワイルドカード キャラクターは展開されます。 # 誰がやってくれているのだろう? VM なんだろうけど # 間違いを書いた、という意味で自信無しにチェックをつけてます (^^; 余計なお世話かもしれないけど i_am_alive> 大概のOSでは、ワイルドカードを使えば、勝手に展開してくれます。 OS が展開するんじゃないですよ。unix の場合は、シェルが展開してくれるの。 試しに、シェルを経由しないでプロセスを起動してごらんなさい(例えば exec系を 使って)。* が展開されないことが分かるでしょう。 MS-DOS は、似非 unix なので、シェルではなくて、コマンドそれぞれが展開して ました。それでは不便だ、ということで特別なオブジェクト (varargs.obj だったか) をリンクすると、main() が呼ばれる前にスタートアップルーチンがファイル名 展開をしてくれる仕組みがあったりしました(C 言語の場合)。 # それとも、ns18 さんにあわせた説明をしているだけですか? # であれば、失礼 m(_ _)m
お礼
#いつのまにかこんなにレスしてくれてたんですね。 #返事が遅れて申し訳ありません。 私はWindowsだの、unixだのよくわからないので、今はWindowsで作って 動作確認していますが、unixでも確認しなくてはいけませんね。 なにはともあれ、a-kuma他、皆さん回答ありがとうございました。
- a-kuma
- ベストアンサー率50% (1122/2211)
Harry_ さんの環境はどうなんでしょうね。私も、実際に動かしてみて確認したの ですが、ダブルクォーテーションでくくらなくても展開されませんでした。 私が確認したのは J2SE 1.4.0 で Windows2000 のコマンドプロンプトです。 # 変なの
- Harry_
- ベストアンサー率55% (36/65)
> a-kuma さん。 いや、それがですね、 Windowsでやってもちゃんと展開されてしまいました。 マッチするファイルがカレントにひとつもないと、 展開されずに *.java がそのまま渡されたので、勘違いして 下の回答を書いたのですが。 ちなみに、本当に *.java を渡したいときは、"*.java" って ダブルクォーテーションでくくるとOKでした。
お礼
なるほど。""で囲むとスペースや*,?などがあっても、 1つの文字列としてコマンドラインで渡されるのですね!! 参考になりました。ありがとうございます。
- a-kuma
- ベストアンサー率50% (1122/2211)
多分、ns18 さんは、プロンプトを '>' で書いているので Windows な人だと 思いますので、No.2 の Harry_ さんが書いてあるような結果になります。 unix だと、それを実行しているシェルが *.java を実際のファイル名に展開して くれるので、引数に実際のファイル名として渡ってきます。 その場合には、File#list(FilenameFilter) を使って、自分で探す必要があります。
- Harry_
- ベストアンサー率55% (36/65)
ごめんなさい。 ファイル名のリスト受け取れるのですね。 知りませんでした。
- Harry_
- ベストアンサー率55% (36/65)
「*.java」という文字列自体が args[0] に格納されるだけですが、 それでよかったのですか? 「*.java」にマッチするファイル名のリストを受け取れるわけではないですよ。
可能でしょうかも何も、main(String[] args)とかやれば、argsに引数として渡りますよ。 Java入門書でも最初の方に出てくると思いましたが。 ↓例 public class ArgTest { public static void main(String[] args) throws Exception { for ( int i = 0 ; i < args.length ; i++ ) { System.out.println(args[i]); } } }
お礼
こんな簡単にできるとは・・・ 何しろ初心者なもので、知りませんでした。 私の持っている本には載っていませんでしたし。。。 とにかくありがとうございました。
お礼
詳しい説明ありがとうございます。 ワイルドカードでファイルやディレクトリがヒットしなかった場合は、 指定した文字列がそのまま渡されるんですね。。 それだとその文字列を使おうとしても確かに存在しないファイルなので エラーとなりますね。 i_am_aliveさんのおっしゃるようにFileクラスで存在の有無をチェック する処理をしなくては。。。。