[Java] cmdコマンドを実行するための方法
こんにちは。明月です。
この投稿はJava環境でcmdコマンドを実行するための方法に関する説明です。
プログラムを作成する時にウェブアプリケーションや一般アプリケーションでほかのプログラムを実行するとか内部サーバをコントロールする時にあります。
例えば、jankinsの場合、ウェブ環境でgitやsvnのコマンドを操作するとかシェルコマンドでウェブ環境でサーバをコントロールするようなプログラムです。
このようにプログラムを通ってシェルコマンドを使う場合がありますが、その時に使うことができるソースコードです。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.concurrent.Executors;
public class ProcessTest2 {
public static void main(String[] args) {
try {
// Linuxの場合は/bin/bash
// Process process = Runtime.getRuntime().exec("/bin/bash");
Process process = Runtime.getRuntime().exec("cmd");
// Processの各ストリームを受け取る。
// processの入力ストリーム
OutputStream stdin = process.getOutputStream();
// processのエラーストリーム
InputStream stderr = process.getErrorStream();
// processの出力ストリーム
InputStream stdout = process.getInputStream();
// スレッドプールを利用して三つのストリームを待ちさせる。
// 出力ストリームをBufferedReaderで受け取ってライン変更がある場合、console画面に出力する。
Executors.newCachedThreadPool().execute(() -> {
// 文字化けが発生する時、InputStreamReader(stdout)にエンコーディングタイプを入れる。ex) InputStreamReader(stdout, "shift_jis")
// try (BufferedReader reader = new BufferedReader(new InputStreamReader(stdout, "shift_jis"))) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(stdout))) {
String line;
// ライン変更(\r\n)たびに、lineにデータが格納される。
while ((line = reader.readLine()) != null) {
// コンソール出力
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
// エラーストリームをBufferedReaderに受け取ってエラー発生する場合、console画面に出力する。
Executors.newCachedThreadPool().execute(() -> {
// 文字化けが発生する時、InputStreamReader(stdout)にエンコーディングタイプを入れる。ex) InputStreamReader(stdout, "shift_jis")
// try (BufferedReader reader = new BufferedReader(new InputStreamReader(stderr, "shift_jis"))) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(stderr))) {
String line;
// ライン変更(\r\n)たびに、lineにデータが格納される。
while ((line = reader.readLine()) != null) {
// コンソール出力
System.out.println("err " + line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
// 入力ストリームをBufferedWriterで受け取ってコンソールから入力されたコマンドをProcessクラスで実行する。
Executors.newCachedThreadPool().execute(() -> {
// Scannerクラスはコンソールから入力を受け取るためのクラスだ。
try (Scanner scan = new Scanner(System.in)) {
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin))) {
while (true) {
// コンソールからEnterが含まれたら「String input」変数に値が格納される。
String input = scan.nextLine();
// コンソールから「\n」が含めたら実行する。(Enterの意味)
input += "\n";
writer.write(input);
// Processでコマンド入力する。
writer.flush();
// exitコマンドを受け取る場合、プログラムを終了する。
if ("exit\n".equals(input)) {
System.exit(0);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上の結果画面をみればコンソールに「cd」のコマンドと「dir」のコマンドを実行して結果を出力する結果のイメージです。最後に「exit」コマンドを実行してプログラムを終了します。
eclipse環境で文字化けがありますが、単純にeclipseのエンコーディング問題です。実際に変数をデバッグでみれば日本語が入力されています。それでも文字化けの問題が解決できなければInputStreamReaderにエンコーディングタイプを入れたら解決なります。
ここまでJava環境でcmdコマンドを実行するための方法に関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
「Devlopment note / Java」の他投稿
- [Java] FTPに接続してファイルをダウンロード、アップロードする方法(FTPClient)2020/03/20 02:44:36
- [Java] JSPのSpring環境でschedulerのcronを使う方法2020/03/18 00:24:32
- [Java] POIを利用してExcelを扱う方法2020/03/17 01:48:00
- [Java] PDFを出力する方法(itextpdf)2020/03/13 00:47:31
- [Java] ログライブラリ(log4j)を使う方法2020/03/12 00:54:39
- [Java] Jsonタイプのデータを使う方法(Gsonライブラリ)2020/03/11 00:30:15
- [Java] Base64をエンコード、デコードする方法2020/03/09 10:24:01
- [Java] cmdコマンドを実行するための方法2020/03/06 18:01:10
- [Java] メール(javax.mail)を発送する方法2020/03/05 20:07:49
- [Java] クラス複製(Clonable, Reflection)2020/03/05 00:03:19
- [Java] シリアライズ(直列化: Serializable)2020/03/03 00:03:33
- [Java] StringBuilderとStringBufferの差異2020/03/02 07:52:22
- [Java] Compare関数を使う方法2020/02/29 03:00:00
- [Java] 数字フォーマット(お金表示及び小数点以下表示)2020/02/28 03:00:00
- [Java] サーブレット環境で現在の実行ディレクトリを取得する方法2020/02/27 03:00:00
最新投稿
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07