このエントリーをはてなブックマークに追加


パイプ(|)によるデータの受取方法

Linux(*BSD)などのシェルでコマンドとコマンド間でデータを渡すときにパイプ(|)を使用しデータのやりとりをしますよね。
Javaで作成したプログラムにパイプ経由でデータを渡すサンプルソースと実行例を記します。

system.inからデータを取得する

以下のサンプルソースの通り、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();
        }
    }
}

実行例

以下に本サンプルソースのコンパイルおよび実行結果を記します。

  • Linux(*BSD)コマンドのprintfコマンドを利用しhello\nworldを
    今回作成したサンプルの入力とした時の実行例です。
    $ printf "hello\nworld" | java PipeIn 
    0001: hello
    0002: world
  • 本サンプルソースをcatで渡し、headコマンドで先頭から10行表示させています。
    $ 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)を扱うサンプルソースでした。


添付ファイル: filePipeIn.java 17件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-08 (土) 21:10:10 (442d)