Javaのコマンドラインパイプ入力
-
07-07-2019 - |
質問
これは簡単なコードです:
import java.io.*;
public class Read {
public static void main(String[] args) {
BufferedReader f = new BufferedReader(new InputStreamReader(System.in));
while(true)
{
String x = null;
try{
x = f.readLine();
}
catch (IOException e) {e.printStackTrace();}
System.out.println(x);
}
}
}
次のように実行します:java Read <!> lt; input.txt
input.txtがプログラムに完全にパイプされると、xは無限のnullを取得し続けます。どうしてこんなことに?ファイルをコードにフィードした後、標準入力(コマンドライン)をアクティブにできる方法はありますか? ストリームを閉じて再度開いてみましたが、機能しません。リセットなども。
解決
"java Read < input.txt"
を実行することにより、オペレーティングシステムに、このプロセスではパイプファイル が標準であると伝えました。アプリケーション内からコマンドラインに戻ることはできません。
これを行う場合は、input.txtをファイル名パラメーターとしてアプリケーションに渡し、アプリケーション内から自分でファイルを開いて/読み取り/閉じてから、標準入力から読み取ってコマンドラインからデータを取得します。
他のヒント
まあ、これはBufferedReader
で読むのに典型的です。 readLine()
は、ストリームの終わりに到達するとnull
を返します。おそらくあなたの無限ループが問題です;-)
// try / catch ommitted
String x = null;
while( (x = f.readLine()) != null )
{
System.out.println(x);
}
次のように、行がnullのときにwhileループを終了する必要があります。
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
catch (IOException e) {
logger.error("IOException reading System.in", e);
throw e;
}
finally {
if (in != null) {
in.close();
}
}
標準入力を作成する方法はありますか(コマンドライン) ファイルがコードにフィードされた後にアクティブになりますか?
古い質問にぶつかって申し訳ありませんが、これまでのところ、ファイルにパイピングした後にコンソール入力に戻す(シェルのみの)方法があるとは答えていません。
コマンドを実行する場合
{ cat input.txt & cat; } | java Read
その後、input.txt
からのテキストはjava Read
に渡され、その後、コンソール入力に戻ります。
Ctrl + D を押すと、プログラムを変更してループを終了しない限り、null
sの無限ループを取得することに注意してくださいnullを受け取ります。