2017-10-13 23 views
0

Javaプログラムのcmdで実行できるコマンドを実行します。いくつかの調査をした後、私はこれを行う方法を見つけたと思った。しかし、私のコードは動作しません。Javaのターミナルで実行できるコマンドを実行する方法

私のコードは、プログラムが実行されるが、出力を生成しません

import java.io.*; 

public class CmdTest { 
    public static void main(String[] args) throws Exception { 
     String[] command = {"ag","startTimes conf.js >> pro.txt"}; 
     ProcessBuilder builder = new ProcessBuilder(command); 
     builder.directory(new File("./test-java/")); 
     Process p = builder.start(); 
    } 
} 

です。私は "ls -a"のような他のコマンドを使ってみましたが、まだ出力はありませんでした。

誰かがこれをデバッグするのに役立ちますか、これを行う良い方法を提案できますか?ありがとうございます

編集1:私はこれをMacで実行しています。これがデバッグに必要な場合

編集2:通常のlsコマンドと他のコマンドは、皆さんが提供しているソリューションで動作しています。しかし、私は、Javaプログラムでag(the_silver_searcher)コマンドを使いたいと思っています。私はそれをしようとすると、私は次のエラーを取得する -

Exception in thread "main" java.io.IOException: Cannot run program "ag startTimes conf.js >> pro.txt": error=2, No such file or directory 
+0

これはWindowsまたはLinux環境で実行していますか? –

+0

@AustinA、私はMacでこれを実行しています – Sid

答えて

0

既存の回答では、コードで問題を解決する方法についての情報が得られますが、コードが機能しない理由はありません。

シェルでプログラムを実行すると、プログラムが実行される前にシェルによって処理が大幅に行われます。あなたが何をしたいのか、ほとんどないだろう - 。あなたのコマンドライン

String[] command = {"ag","startTimes conf.js >> pro.txt"}; 
    ProcessBuilder builder = new ProcessBuilder(command); 

は、コマンドag単一引数startTimes conf.js >> pro.txtで実行されていることを前提ともう一度進んでください:もしあなたが書きましたか?

String[] command = {"ag","startTimes", "conf.js", ">>", "pro.txt"}; 
    ProcessBuilder builder = new ProcessBuilder(command); 

このagコマンドはその出力をリダイレクトするように>>パラメータについて知っていることを前提としています - シェルの出番とここにある:>>オペレータが何をすべきか、それを言って、シェルに指示ですそのプロセスの標準出力からの出力と比較します。プロセスagは、シェルによって起動されたときに、このリダイレクションのアイデアは決してなく、>>とターゲットファイル名についての手がかりが全くありません。

この情報では、他の回答のコードサンプルを使用してください。私はそれらを適切な帰属のために私のものにコピーしません。

+0

Olafさん、本当にありがとうございました。私はついにこの問題を解決することができた – Sid

0

ProcessBuilderがあるが、私はいつもRuntime.getRuntime().exec("cmd");

Process Runtime.exec(String)

を使用しましたそれはあなたが入力と出力を得ることができますProcessを返します。

ProcessBuilderに滞在しても、Process.get<Input/Output/Error>Stream()

0にアクセスする必要があります。
+0

エラーが発生しました - "スレッド" main "java.io.IOExceptionの例外:" ag startTimes conf.js >> pro.txt "を実行できません:error = 2、Noそのようなファイルまたはディレクトリ "と呼びます。私は何をお勧めしますか? – Sid

+0

@Sid完全なファイルパスを入れてみると、ローカルディレクトリからコマンドが実行されている可能性があります – phflack

0

あなたは、プロセスからの入力ストリームを開くことによって、プロセスの出力を読み込む必要があります。

try (BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())) { 
    System.out.println(reader.readLine()); // process the output stream somehow 
} 

またあなたは、私は頻繁に別のストリームで行われているエラーストリーム(p.getErrorStream())を、読むかもしれません、 Java 8では、ProcessBuilderredirectErrorStream(true)を使用して、自動的にエラーストリームを入力ストリームに追加することができます。もちろん、入力がどのストリームから来るのかをはっきりさせることはできませんが、読みやすくなります。入力ストリームまたはエラーストリームを読み取っておらず、プロセスのバッファがいっぱいになると、バッファに十分な空きがあるまでプロセスは一時停止する傾向があります。

+0

エラーが発生しました - "スレッド" main "java.io.IOExceptionの例外:" ag startTimes conf.js >> proを実行できません。 txt ":エラー= 2、そのようなファイルやディレクトリはありません"。私は何をお勧めしますか? – Sid

0

また、コンソールに出力をリダイレクトし、startメソッドの前に

builder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 

を追加することができます。

+0

ちょっとベン、私のようなコマンドを使用すると、あなたのソリューションが動作します。しかし、私がagコマンドを使用すると、エラーが発生する - スレッド "main"の例外java.io.IOException: "ag startTimes conf.js >> pro.txt"プログラムを実行できません:error = 2、そのようなファイルがありませんまたはディレクトリ – Sid

+0

私は今何ができますか? – Sid

+1

新しい質問をしています。あなたに提供された2つのソリューションの1つを受け入れ、新しいSOの質問を掲載するのは公正だろう。 –

0
//"ls" command runs under the "sh" on linux(cmd.exe on windows), so first arg is "sh"  
//second arg "-c" tells "sh" which exact command should be executed 
//"ls" is actual command 
//"startTimes" as I understand is a file or directory, it is arg for "ls" command 
//"conf.js" is second arg for "ls" command 
new ProcessBuilder("sh", "-c", "ls", "startTimes", "conf.js") 
//set working dir for "sh" process" 
      .directory(new File("./test-java/")) 
//output will be written to "pro.txt" in working dir of "sh" process 
      .redirectOutput(new File("./test-java/pro.txt")) 
      .start(); 
+1

[よくある回答を書くにはどうすればいいですか](https://stackoverflow.com/help/how-to-answer)をご覧ください。コードのみの回答は、質問の問題の解決方法を説明していないため、お勧めできません。あなたの答えを更新して、これが何をし、どのように問題を解決するのかを説明する必要があります。 – FluffyKitten

関連する問題