「タイムカール-s」コマンドを実行しますするための最良の方法だろう何Javaは、私は、このコマンドを実行したいと思っています
real 0m0.293s
user 0m0.100s
sys 0m0.052s
:Javaでは
time curl -s 'URL HERE'
をとのような結果を得ますこれを行う?
「タイムカール-s」コマンドを実行しますするための最良の方法だろう何Javaは、私は、このコマンドを実行したいと思っています
real 0m0.293s
user 0m0.100s
sys 0m0.052s
:Javaでは
time curl -s 'URL HERE'
をとのような結果を得ますこれを行う?
一般的な方法は、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()
を使用して、所要時間を計算することができます。
あなたはAPIのクラスを使用する必要があります:あなたは、コマンドを実行ProcessBuilder
コードを記入してください。私たちはあなたのためにそれをするのではありません。あなたはコードを書いて、私たちは(多分)それを修正しようと試みます。 –
私はこの質問に答えて、それが実際には驚くほど困難であることを発見しました。 –