2016-07-14 19 views
0

「タイムカール-s」コマンドを実行しますするための最良の方法だろう何Javaは、私は、このコマンドを実行したいと思っています

real 0m0.293s 
user 0m0.100s 
sys  0m0.052s 

:Javaでは

time curl -s 'URL HERE' 

をとのような結果を得ますこれを行う?

+0

コードを記入してください。私たちはあなたのためにそれをするのではありません。あなたはコードを書いて、私たちは(多分)それを修正しようと試みます。 –

+0

私はこの質問に答えて、それが実際には驚くほど困難であることを発見しました。 –

答えて

2

一般的な方法は、Runtime.getRuntime().exec()を呼び出すことであろう。 Runtime.getRuntime().exec()は与えたコマンドを実行します。しかし、いくつかの注意点があります。

まず、timeはシェル組み込みコマンドです。

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

それはあなたがsh -cでこの問題を解決することができようになっています:あなただけ

Runtime.getRuntime().exec("time curl -s 'http://www.google.com/'"); 

を呼び出す場合は、次のようなエラーが発生します

Runtime.getRuntime().exec("sh -c \"time curl -s 'http://www.google.com/'\""); 

しかし、あなたがすることはできません。 exec()は、引用符で囲まずにスペース文字を使用して、引数で指定した文字列を分割します。これは迷惑です。

Process process = new ProcessBuilder("sh", "-c", "time curl -s 'http://www.google.com/'").start(); 

このコマンドは失敗しませんが、また何かをする表示されません:あなたはProcessBuilderていることを修正することができます!これは、Javaが標準出力に対して実行されたコマンドの出力を自動的に送信しないためです。これを行うには、出力を手動でコピーする必要があります。

Process process = new ProcessBuilder("sh", "-c", "time curl -s 'http://www.google.com/'").start(); 
InputStream in = process.getInputStream(); 
int i; 
while (-1 != (i = in.read())){ 
    System.out.write(i); 
} 

出力はコピーされますが、エラーはコピーされません。 process.getErrorStream()(これはInputStreamを返します)と同じコピー手順を実行できます。またredirectErrorStream()を使用することができます。

Process process = new ProcessBuilder("sh", "-c", "time curl -s 'http://www.google.com/'").redirectErrorStream(true).start(); 
InputStream in = process.getInputStream(); 
int i; 
while (-1 != (i = in.read())){ 
    System.out.write(i); 
} 

あなたが適切にJavaでコマンドを実行する方法です。

編集:You could also download the file in Java natively.この場合、System.nanoTime()を使用して、所要時間を計算することができます。

1

あなたはAPIのクラスを使用する必要があります:あなたは、コマンドを実行ProcessBuilder

関連する問題