2012-03-21 12 views
1

私はJavaプログラムの中で "cut"を実行しようとしていますが、コマンドの配列を分割する方法は分かりません。 コマンドラインでの私のプログラムは以下の通りです:Javaで外部プログラムを実行

cut file.txt -d' ' -f1-2 > hits.txt 

そして、私はこの

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(new String[]{"file.txt"," -d' ' -f1-2 "," > hits.txt"}); 
pr.waitFor(); 

のようなJavaの内部でそれを実行しようとしています。しかし、私は、次のランタイムエラー

Exception in thread "main" java.io.IOException: Cannot run program "cut file.txt": java.io.IOException: error=2, No such file or directory 

を取得します私はexecコマンドとして使用している文字列の配列にこのエラーがあると考えています。これを行う方法に関するアイデア?また、問題に関する既知のドキュメント。ありがとう

+0

「pr2」と「rt2」?変数名を修正してください。 –

+0

Javaプロセスを実行するユーザーにファイル 'file.txt'へのアクセス権がないか、またはおそらくfile.txtがJavaプロセスを実行しているディレクトリと同じディレクトリにないようです。相対パスを修正するか、絶対パスに切り替えることができます。 – Brad

+2

これは正確なコードですか?コマンド配列内にカットしてはいけませんか? –

答えて

1

bashのためのいずれかのスクリプトを作成します:

"/bin/bash" "-c" "cut file.txt -d' ' -f1-2 > hits.txt" 

または分割

"cut" "file.txt" "-d" "' '" "-f" "1-2" 

エラーメッセージが明確に言う:

Cannot run program "cut file.txt" 

ので、それはとして "file.txtをカット" 解釈内部に空白を持つ単一のプログラム名。あなたが入力および出力ストリームを処理する必要が

"cut" "file.txt" "-d" "' '" "-f" "1-2" ">" "hits.txt" 

:あなたが道出力をリダイレクトすることはできませんので

あなたの問題は、リダイレクトで始まります。 cutをJavaで実装して、移植可能なソリューションを入手したり、コマンドラインや設定ファイルで指定できるスクリプトを呼び出して、Windowsや他のプラットフォームに適合させることができます。

/bin/bashを呼び出してリダイレクトすると、UNIX系のシステムでうまくいくはずです。

+0

"-c"は何をしますか? –

+1

@JulioDiaz: '-c'は、コマンドの後に続くことを意味します。 'bash --help'を参照してください。コマンドは3番目のStringで、bashによってスクリプト全体として解析されます。 –

1

出力リダイレクションを希望する場合は、自分で行う必要があります。 > hits.txtはあなたが望むことをしません。 execというプロセスからのstdoutのリダイレクトはin another StackOverflow questionに含まれています。

あなたが表示しているエラーは、ここに挙げたソースコードと一致しません。cutのソースはありません。 cut file.txtが、単一の実行ファイルの完全な相対パスであることを間違いなく理解しようとしています。正しいコードでこれをトラブルシューティングする方が簡単です。