2013-09-04 17 views
6

私は情報が入ったファイルを持っています。それは次のようになります:ファイル内の文字列を分割して読み込む方法は?

Michael 19 180 Miami 
    George 25 176 Washington 
    William 43 188 Seattle 

私は行と文字列を分割して読みたいと思います。私はこのようなコードを使用

Michael 
    19 
    180 
    Miami 
    George 
    ... 

::私はそれが見えるようにしたい、これが私に与えた何

BufferedReader in = null; 
    String read; 
    int linenum; 
    try{ 
     in = new BufferedReader(new FileReader("fileeditor.txt")); 
    } 
    catch (FileNotFoundException e) {System.out.println("There was a problem: " + e);} 
    try{ 
     for (linenum = 0; linenum<100; linenum++){ 
      read = in.readLine(); 
      if(read == null){} 
      else{ 
       String[] splited = read.split("\\s+"); 
       System.out.println(splited[linenum]); 
      } 
     } 
    } 
    catch (IOException e) {System.out.println("There was a problem: " + e);} 
} 

、私はループのための私との、おそらく問題を考える

Michael 
    25 
    188 

ましたプログラミングにはあまり進んでいないので、私は助けに感謝します。ありがとう。

答えて

5

あなたは素晴らしい方法です。

ファイルを読み取るとき、はストリームの最後に達したときにnullを返します。つまり、読み取ることのできるものはほかにありません。あなたの現在のアプローチは、あなたが少なくとも100行を読みたいと思うことを意味しますが、これ以上...ファイルサイズが増えるとこれは将来的に問題になるでしょう...それはやや無駄でもあります

代わりに、 nullの値は、ファイルの末尾を示します。

行を分割すると、いくつかの要素が含まれます。これらを印刷するには、linenum変数を使用しています。問題は既に線を読み込んで分割していることです。linenumは、読み込んだ行の数を表していて、分割した文字列の部分ではなく、このタスクとは無関係です。あなたの場合は例えば

代わりに、あなたは各行の個々の分割要素を表示するには、内側のループを使用する必要があります...

...また

BufferedReader in = null; 
try { 
    in = new BufferedReader(new FileReader("fileeditor.txt")); 
    String read = null; 
    while ((read = in.readLine()) != null) { 
     String[] splited = read.split("\\s+"); 
     for (String part : splited) { 
      System.out.println(part); 
     } 
    } 
} catch (IOException e) { 
    System.out.println("There was a problem: " + e); 
    e.printStackTrace(); 
} finally { 
    try { 
     in.close(); 
    } catch (Exception e) { 
    } 
} 

は、忘れてはいけませんあなたにもBasic I/Oを通過もう少し時間を取るために)

たいかもしれません;あなたはカビ近いそれを、それを開く)

2
String[] splited = read.split("\\s+"); 
    for (int i= 0; i<splited.length; i++){ 
    System.out.println(splited[i]); 
    } 

文字列を分割した後に結果をループする必要があります。

1

あなたはを使用することができます。ストリームの設定に従って、ストリームをトークンに分割します。あなたの質問から、私はあなたがトークン区切り記号と同様に行末を扱いたいと思うと思います。コードは次のようになります。あなたはさまざまなオプションを設定する必要があるかもしれません入力woth何をする必要があるかに応じて、

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.StreamTokenizer; 

public class ReaderSample { 

    public static void main(String[] args) { 
     BufferedReader in = null; 
     try { 
      in = new BufferedReader(new FileReader("fileeditor.txt")); 
      StreamTokenizer st = new StreamTokenizer(in); 
      st.eolIsSignificant(false); 
      // remove comment handling 
      st.slashSlashComments(false); 
      st.slashStarComments(false); 

      while(st.nextToken() != StreamTokenizer.TT_EOF) { 
       if (st.ttype == StreamTokenizer.TT_NUMBER) { 
        // the default is to treat numbers differently than words 
        // also the numbers are doubles 
        System.out.println((int)st.nval); 
       } 
       else { 
        System.out.println(st.sval); 
       } 
      } 
     } 
     catch(IOException ex) { 
      System.err.println(ex.getMessage()); 
     } 
     finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } 
       catch (IOException ex) { 
       } 
      } 
     } 
    } 
} 

、ドキュメントはここであなたを助けるべきです。

+0

「スキャナ」を使用して2番目の考えではより良いようです。 'StreamTokenizer'は時代遅れです。 –

関連する問題