2017-11-17 5 views
1

私は、指定されたテキストファイルを行単位で読み込む簡単なメソッドを作成しようとしています。私はそれをしようとしていたが、それは奇妙な結果を示しています。それは、単一の線が倍の多くをループし、それが適切にペアを出力し、最後の行を示していくつかの理由についてファイルからの行ペアの一覧[Java]

public class MyList{ 
    List<String> elements = new LinkedList<>(); 

    public void createPairs() throws IOException { 
     Scanner scanner = new Scanner(new File("file.txt")); 
     scanner.useDelimeter("\n"); 
     while(scanner.hasNext()){ 
      elements.add(scanner.next()); 
     } 
     scanner.close(); 

     for(String i: elements){ 
      for (String j:elements){ 
       System.out.println(i+" "+j); 
      } 
     } 
    } 

:私のコードは次のようになります。 file.txtとが含まれているかどうすなわち:

1 
2 
3 

を結果は次のようになります。リストへのファイルの読み取り

1 
2 
3 
1 
2 
3 
... //it loops for some time 
3 1 
3 2 
3 3 

私は単に「要素」リストにそれを印刷しようとするので、おそらく大丈夫です別々のList要素にファイルの各行を正しく表示します。 私はここで何が間違っているのか分かりません...助けてください。

+0

"1"、 "2"、 "3"を単純にリストに追加すると(入力ファイルを無視して)再現できません。ファイルには、あなたが思うものが含まれていない可能性があります。 – Eran

+0

コード自体に何か問題はありません。 – Yash

+0

何回出力にループしましたか? – Sweeper

答えて

3

あなたはWindowsマシンを使用していますか?

Windowsでは、改行文字は、\nではなく、\r\nで表されます。したがって、ファイルを作成するときにEnterキーを押すと、実際には\r\n文字が作成されます。

これはあなたのテキストファイルは、あなたのコードに次のようになりますことを意味します

1\r\n2\r\n3 

今、あなたは区切り文字が\nであることと、それを読むためにスキャナを使用するようにしてください。何が起こるかというと、それは次の文字を読み取りますということです。今

1\r 
2\r 
3 

、あなたはどうなるの全く異なる\r文字、何かを印刷しようとすると。 \rは送料の返品となります。これは、タイプライター時代のレガシーキャラクターの1つです。タイプライタでは、キャリッジリターンキーを押すと、「カーソル」が行の先頭に戻り、新しい行キーを押して新しい行を開始する必要があります。では、キャリッジリターンキーを押しただけではどうなりますか?元々行の先頭に書かれているものを上書きします!したがって、以下の例では「World」のみが印刷されます。

System.out.println("Hello\rWorld"); 

だからこそ、このファンキーな出力を得ることができます。

これを解決するには、区切り記号の使用をやめ、スキャナーでnextLineを試してみてください。これは、OSに関係なく常に1行ずつ読み込まれます。

+0

うん、私はWindowsを使用しています。今は魅力のように機能します。ありがとう:)私はそれが有名なWindowsの "後方互換性"であると仮定します。パス変数の長さと同じように:) – Arkadeusz91

関連する問題