2010-11-30 3 views
-3

私はScanner + System.inでファイルを読んでいます。ファイルの終わりに達したとき、私が読んで停止することができますどのように..Scanner + System.in stop condition

Scanner input = new Scanner(System.in); 

    while (input.hasNextLine()) 
    { 
     String log_line = input.nextLine(); 
    } 

質問されています。私のような入力を読んでいる

cat -A test.txt | java -jar test.jar 

:Linuxでの私のコマンドは次のようになりますか?

+0

これが投稿されてから4年後に質問の重複をどのようにマークすることができるか分かりません。 –

+1

@MeghanArmes重複して投票するときは、時間は関係ありません。私たちはより良い投稿をターゲットにすることを好みます。 –

+0

@ジャロッドは閉じた質問の重複として質問を閉じることは一般的には良い考えではありません。それは新しい答えを得る方法を妨げます。再開してください。 –

答えて

2

その問題が-Aオプションではなく、Javaコード(それはプレーンファイルで正常に動作します)ようです:たぶんtest.txtのは、そのスキャナができないいくつかの非印刷可能な文字が含まれてい

$ echo -e "foo\nbar" | java -jar Test.jar 
foo 
bar 
$ 

ハンドル...

+0

test.txtは別のプログラムによって生成されたファイルであり、すべての文字がきれいに見えます。echoとはどういう意味ですか?エコーはファイルの内容を表示しませんか?以前は私はtailコマンドを使用していましたが、そこにprobalemがあります。私はそう思っています。 – Serhiy

+0

私は便宜のためにエコーを使用しました。 (とはい、 'echo -e" 1 \ n2 \ n3 "> test.txt | tail -n 2 test.txt | java -jar dist/Test.jar のような大きな違いはありません。ところで、どのターミナルエミュレータを使用していますか? –

+0

Omg、私は本当に愚かでなければならないか、本当に疲れています。私が持っている別のスレッドは止まっていなかったので、プログラムは終了しませんでした。 – Serhiy

3

問題は、System.inは決して "終了"しません。つまり、EOFはストリームに送信されません。したがって、最後の行の後にhasNextLine()がブロックされているため、さらにデータを待っています。

解決策は、FileInputStream(filePath)を開いてスキャナコンストラクタで使用するよりも、ファイル名をアプリに渡すことです。

+0

奇妙なことですが、それは私のために働いています(Serhiyのコードをコピーしてstdoutにエコーした行を追加しました):) –

+0

MyabeにはScannerの代替手段がいくつかありますか?私はargsを通してfileneameを渡すことを望んでいませんでした.. – Serhiy

+0

私はあなたの解決策を論じているわけではありません(より良い/より安全です)、ただ好奇心が強いです:http://img13.imageshack.us/img13/3706/scanner.png –