2011-11-30 7 views
16

私はJavaでプログラムを書いています。私がする必要があることの1つは、最短パスの問題のためのすべての有効な場所のセットを作成することです。場所は.txtファイルで定義され、厳密なパターン(1行につき1つのエントリ、余分なスペースなし)で定義され、.nextLineを使用してデータを取得するのに最適です。私の問題は、ファイルに241行(432のうち)のスキャナがエントリの3/4の作業を停止し、新しい行を認識しないことです。Javaスキャナがファイル全体を通過しない

マイコード:もちろん

//initialize state space 
private static Set<String> posible(String posLoc) throws FileNotFoundException { 
    Scanner s = new Scanner(new File(posLoc)); 
    Set<String> result = new TreeSet<String>(); 
    String availalbe; 
    while(s.hasNextLine()) { 
     availalbe = s.nextLine(); 
     result.add(availalbe); 
    } 
    s.close(); 
    return result; 
} 

データ

Shenlong Gundam 
Altron Gundam 
Tallgee[scanner stops reading here]se 
Tallgeese II 
Leo (Ground) 
Leo (Space) 

、「スキャナはここ読んで停止し、」スキャナがファイルの読み込みを停止した場合、私はちょうどマーキングてる、データではありません。これはファイルへの3068バイトですが、同じプログラムでほとんど同じコードで、パスをエンコードする261行の14 KBの.txtファイルを読み込んでいるため、何も影響しません。どんな助けもありがとう。

ありがとうございます。

+1

実際のデータファイルをどこかで見ればアップロードできますか? – NPE

+1

例外がスローされますか?空のキャッチブロックはありますか? –

+0

誰もがペーストビンが使えることを願っています。 [データ](http://pastebin.com/rt3mbXtD) – Fizzmaister

答えて

15

スキャナがファイルを読み取る際に問題がありますが、その内容がわかりません。間違ってファイルの終わりに達していると信じていますが、おそらくファンキーな文字列エンコーディングが原因です。代わりにFileReaderオブジェクトをラップするBufferedReaderオブジェクトを使用してみてください。

例えば、

private static Set<String> posible2(String posLoc) { 
     Set<String> result = new TreeSet<String>(); 
     BufferedReader br = null; 
     try { 
     br = new BufferedReader(new FileReader(new File(posLoc))); 
     String availalbe; 
     while((availalbe = br.readLine()) != null) { 
      result.add(availalbe);    
     } 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     } 
     return result; 
    } 

編集
私はその最低限にあなたの問題を軽減しようとしたし、ちょうどこれが問題を誘発するのに十分だった。

public static void main(String[] args) { 
     try { 
     Scanner scanner = new Scanner(new File(FILE_POS)); 
     int count = 0; 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      System.out.printf("%3d: %s %n", count, line); 
      count++; 
     } 

私はスキャナのオブジェクトをチェックしますprintfで:

となり、ファイルが終了したと考えられることが示されました。私は、問題の原因となった行を調べるために、データからファイルへ行を徐々に削除していましたが、残しておきます。

+0

ありがとう、それは働いた。私は何がスキャナに間違っているか分かりませんが、それはすべてを読み取っています。 – Fizzmaister

+0

@Fizzmaister:編集をご覧ください。 –

+3

そして私たちは決して知らないでしょう。 :/ – Bryan

4

私は同じ問題を抱えていました。スキャナはファイルの終わりまで読み取らず、実際には単語の真中で停止します。私はそれがスキャナに設定されているいくつかの制限で問題だと思ったが、rfeakからの文字エンコーディングについてのコメントに注意した。

私はUTF-8に読んでいた.txtを再保存して、問題を解決しました。メモ帳がANSIにデフォルト設定されていたことが判明しました。

-1

あなたはこれを使用する必要があります。

スキャナスキャナ=新しいスキャナ(fileobjを).useDelimiter( "\ zの");
System.out.println(scanner.next());

+1

これはコンパイルされず、コンパイルしてこの問題を解決するのに近づくこともありません。 – wvdz

6

私は同じ問題が発生し、これが、私はそれを修正するために何をしたかである:

1.Saved the file I was reading from into UTF-8 
2.Created new Scanner like below, specifying the encoding type: 


    Scanner scanner = new Scanner(new File("C:/IDSBRIEF/GuidData/"+sFileName),"UTF-8"); 
+0

これは私の問題を解決しました。基本的に私のスキャナは1つのエンコードを想定していましたが、Notepad ++は別のものを想定していました。両方の場所で同じエンコーディングを指定すると、私の問題は解決されました。 –

+0

この部分は私の問題を解決しました:)、 "UTF-8");ありがとう! –

0

私はスキャナが行862で読んで停止し、それは奇妙な問題があったにtxtファイルを持っていました。私がしたのは、問題を再現しようとするために別のファイルを作成することでした。最初に862行未満を追加した後、862以上を追加して正常に動作しました。

私の問題は、以前のファイルの862行目で、Scannerを早めに読み終えるように誤っている可能性のある文字や記号のような問題があったと思います。

結論:この経験に基づいて、問題の種類の解決策を見つけるためにスキャナが読み取りを停止する正確な行を見つけることをおすすめします。

関連する問題