質問

これは簡単なコードです:

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を受け取ります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top