Linux(*BSD)などのシェルでコマンドとコマンド間でデータを渡すときにパイプ(|)を使用しデータのやりとりをしますよね。
Javaで作成したプログラムにパイプ経由でデータを渡すサンプルソースと実行例を記します。
以下のサンプルソースの通り、system.inにデータがあるか(パイプによるデータ受け渡しがあるか)をチェックし
その後、InputStreamReader, BufferedReaderをつかって一行ずつ読み込んでいます。
本サンプルソースでは、読み込んだ行の先頭に行番号を%04dという形で表示しています。
尚、文字コードはLinux(Ubuntu)にて動作確認を行ったので、UTF-8を指定しています。
class PipeIn { public static void main(String[] args) { try { if (System.in.available() != 0) { InputStreamReader in = new InputStreamReader(System.in, "UTF-8"); BufferedReader b = new BufferedReader(in); String l; int i = 1; while (null != (l = b.readLine())) { System.out.printf("%04d: %s\n", i, l); i++; } } else { System.out.println("No input by the pipe."); } } catch (IOException e) { e.printStackTrace(); } } }
以下に本サンプルソースのコンパイルおよび実行結果を記します。
$ printf "hello\nworld" | java PipeIn 0001: hello 0002: world
$ cat PipeIn.java | java PipeIn | head -10 0001: import java.io.*; 0002: 0003: class PipeIn { 0004: public static void main(String[] args) { 0005: try { 0006: if (System.in.available() != 0) { 0007: InputStreamReader in = new InputStreamReader(System.in, "UTF-8"); 0008: BufferedReader b = new BufferedReader(in); 0009: String l; 0010: int i = 1;
$ java PipeIn No input by the pipe.
使用したJDKバージョン
$ java -version; javac -version openjdk version "9-internal" OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195526.buildd.src) OpenJDK Server VM (build 9-internal+0-2016-04-14-195526.buildd.src, mixed mode) javac 1.8.0_131
以上、Javaでパイプによる入力(STDIN)を扱うサンプルソースでした。