2017-04-10 6 views
-3

私は似たような話題を見ましたが、実際の解決策をまとめているようには見えません。私は(部分的に)いくつかの操作を実行するためにstdinから値を読み込むプログラムを書いています。しかし、私は、実行時にテキストファイルからの入力をリダイレクトしようとしているので、Ctrl + Z(ウィンドウ)を使用してEOFを発行するだけではありません。JavaスキャナhasNextLine()ブロッキングの問題

String s; 
    int v2 = 0; 
    double w = 0; 
    int v1 = 0; 
    int i = 0; 
    Scanner sc = new Scanner(System.in); 
    while(sc.hasNextLine()){ 
     s = sc.nextLine(); 
     String[] arr = s.trim().split("\\s+"); 

     v1 = Integer.parseInt(arr[0]); 
     v2 = Integer.parseInt(arr[1]); 
     w = Double.parseDouble(arr[2]); 

     i++; 
    } 
    System.out.println(i); 
    sc.close(); 

hasNextLineは()無期限にブロックしているようです(私の推測とにかく)として私は、最後のprint文を得るように見えることはありません。ここ

は、入力ファイルの形式の一例である:

0 1 5.0 
1 2 5.0 
2 3 5.0 
3 4 5.0 
4 5 5.0 
12 13 5.0 
13 14 5.0 
14 15 5.0 
... 
-1 

それは、INT INT二重の形式で常にあるが、間隔が文字列操作したがって、変化することができます。また、常に-1で終了します。

私は混乱を避けるためには関係ありませんほとんどのコードを残してきた無駄

String s; 
int v2 = 0; 
double w = 0; 
int v1 = 0; 
int i = 0; 
Scanner sc = new Scanner(System.in); 
while(sc.hasNextLine()){ 
    s = sc.nextLine(); 
    String[] arr = s.trim().split("\\s+"); 

    v1 = Integer.parseInt(arr[0]); 
    if(v1 < 0){ 
     break; 
    } 
    v2 = Integer.parseInt(arr[1]); 
    w = Double.parseDouble(arr[2]); 

    i++; 
} 
System.out.println(i); 
sc.close(); 

に次のことを試してみました。私は必要に応じて投稿することができます。

ありがとうございます。

EDIT:わかりやすく編集されています。また、行の内容に関係なく入力ファイルの最後の行にぶら下がっていることに気づいた(つまり、有効な行がぶら下がっている)。私はeclipse(Neon)経由でリダイレクトしています。

+0

の可能性のある重複した[条件として、スキャナの方法を使用してJavaでwhileループ「のhasNext」から抜け出すためにどのように?](http://stackoverflow.com/questions/10490344/how-to-get-out- while-while-while-loop-in-java-with-scanner-method-hasnext-as-condition) – Tom

+0

私は謝罪しましたが、私はhasNextLine()を取り回そうとした別のバージョンのコードを使用しました。私も、あなたが言及したスレッドを見て、そのソリューションを実装しようとしましたが、それは動作しませんでした。 –

+0

そして、「*そのソリューションを実装しようとしましたか」のように見えますか? – Tom

答えて

0

あなたのコードはうまくいくようです。 hasNextLineをチェックすることはできますが、EOFがカスタマイズされていれば他の条件もチェックできます(あなたの場合は-1です)。あなたのコードがそれらに脆弱であるならば、あなたはいくつかの例外を捕まえるかもしれません。以下のコードは私のためにうまくいった。

 Scanner scanner = new Scanner(new File("/opt/test.txt")); 
     int secondValue = 0; 
     double lastValue = 0; 
     int firstValue = 0; 
     int LineNumber = 0; 
     while ((scanner.hasNextLine())) { 
      try { 

       String[] arr = scanner.nextLine().trim().split("\\s+"); 

       firstValue = Integer.parseInt(arr[0]); 
       secondValue = Integer.parseInt(arr[1]); 
       lastValue = Double.parseDouble(arr[2]); 
       doSomeThing(firstValue,secondValue,lastValue); 

       LineNumber++; 
      } catch (Exception excep) { 

      } 
     } 
     System.out.println(LineNumber); 
} 
+0

テストに感謝します。私はその日の奇妙な設定(または私のシステム上にあるいくつかの奇妙な設定)その賭けている。 –

+0

TomのTypoのために私のコメントを削除しました。 –

+1

Ohhは私の2つのnextLineに気付きました... Thanks Tom –