2011-07-28 10 views
0

私は計算に使用しなければならない数字と比較に使用する文字を含む入力ファイルを処理しようとしています。このようなファイルからintとcharの両方を1つずつ読み取る方法は?

6 
foobar 

やコード::簡単な例は、このようなファイルである

n = readInInt 
    while n > 0 
    c = readInSingleChar 
    if (c = 'f') 
     doSomething 
    n-- 

現在、私は、でDataStreamとBufferedReaderとFileReaderをを含む、ここでとGoogleを経由して多くのオプションを見つけることですあまりにも多くの方法があるように思えますし、私はそれらがすべて私が必要としているように働くかどうかはわかりません。私の必要性がはっきりしていないかどうか教えてください。

要するに、ファイルごとにファイルを読み込み、数字をint、文字と記号をcharと解釈して使用する必要があります。

これを行う最も簡単な方法は何ですか?私は物事を行う専門的な方法があることを知っています。これは一度限りの趣味のような個人的な使い方のためのものであり、頑丈で堅牢な機能を求めているわけではありません。それはちゃんと働かなければならない。

ありがとうございます!

+1

試したことがありますか?どこに問題がありますか?パフォーマンス?他に何か? –

+0

いくつかの行のテキストといくつかの計算がありますか(1行に2つを混ぜることはありません)?あなたはいくつかの行に数字だけを持っていますか、あるいは "+"か "add"で数字を持っていますか? – toto2

答えて

1

私は最も簡単な使い方を感じていますStreamTokenizerこのクラスは、intや文字列を解析するために必要なユーティリティを提供します。

私のような何かを始めるでしょう - ここ

StreamTokenizer tokenizer = new StreamTokenizer(new BufferedReader(new FileReader("foo.in"))); 

while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) { 

       if (tokenizer.ttype == StreamTokenizer.TT_WORD) 
        // use tokenizer.sval 
       else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) 
        // use tokenizer.nval 
      } 

がそれを使用する方法についてexampleです。上記は、ファイルをトークン化しcharをcharで読むための非常に一般的な方法です。パフォーマンス上の理由から、もちろんFileReaderまたはBufferを使用する必要があります。

Scannerも使用できます。サンプルコードを使用すると、簡単な解決策を探しているなら、java.util.scannerが見て良いものでしょう

Scanner s = new Scanner(file); 
s.useDelimiter(""); // reads one char a time 
while(s.hasNext()){ 
    if(s.hasNextInt(){ 
    // then do something with s.nextInt() 
    }else{ 
    // then do something with s.next() 
    } 
} 
+0

さらに詳しいヘルプはこちらhttp://stackoverflow.com/questions/2597841/scanner-method-to-get-a-char –

+0

すばらしいですが、useDelimiterのパラメータを空白にしておくとわかりませんでした。 私の今の唯一の問題は、新しい行に出会ったときに壊れているように見えることです。これを回避するにはどうしたらいいですか? – Matthew

+0

@Mathewは答えを受け入れることを忘れないでください。 –

1

ようなものです。

さまざまなデータ型(intやStringなど)で読み込むための使いやすいメソッドがあります。

I/Oストリームを使用して検出したソリューションは、もう少し複雑で、おそらくあなたが持っているタスクにとって有用ではありません。彼らはとなるでしょう(そして、より大規模なアプリケーションには最適です)。

例えば、カスタム区切り文字使用:

Scanner s = new Scanner(new File("txtfile.txt"); 
s.useDelimeter(Pattern.compile("\n|"); //The newline character (\n) and null 
             //character are the delimeters. 
while (s.hasNext()) { 
    if (s.hasNextInt() { 
     //Do something 
    } else { 
     //Handle characters 
    } 
} 

(参考:Pattern

この直接的なアプローチに伴う問題は、それが複数桁の整数にならないことです。

標準的な区切り文字を使用する方法もあります。次に、文字を読みたいときは、トークン全体を読み込み(例では "foobar"で読み込みます)、ループ内で個々の文字を個別に処理します。

String str = s.next(); 
for(char c : str.toCharArray()) { 
    //handle characters 
} 
+0

+1スキャナも良い解決策です –

+0

私はスキャナを元々使っていましたが、質問があります。一度に1つの数字、文字、または記号しか受け付けないようにするにはどうすればよいですか?ファイルから読み込むときに入力を制御することについて私が知っているのは、デリミタを使用することだけです。 文字列を文字列でスキャンするときに、1文字のみで、文字または行のグループではないことを確認するにはどうすればよいですか? – Matthew

+0

@Mathew、sc.useDelimiter( "")を使用する必要があります。私のコードを見てください。 –

関連する問題