2011-01-18 10 views
0

Java noobの種類、およそ6種類のストリーム+スキャナの間を反転して、必要なすべてを行う方法が見つからない。特定の構文に従うファイルを解析するアルゴリズムを実装しようとしています。次の文字を括弧またはコンマであるかどうかを調べるために必要な場所がいくつかあり、文字列と小数値を読み取ることができる必要があります。私はそれがダブルを読むことを試みた点までストリームで作業していました。 doubleはバイナリ形式ではないので、DataInputStreamは私が望むものではありません。Javaとの混合データの解析

私はそのgetNextFloatスキャナを使用することができますが、スキャナを使用しての問題は、ファイルには、実際の区切り文字がないです:私は、その後、スキャナとの区切り文字として(,:)を指定した場合(test:1.234,rightTest:5.6789)

は、区切り文字の存在をテストする能力を失います(私はthionkです、それは区切り文字を食べるように見えるからです)。これらのブロックはさまざまな方法で入れ子にすることができるので、次の文字をテストして、かっこが開いているかどうかを確認し、別のロジックに分岐する必要があることがよくあります。私。それはツリーを形成します(ただし、それは私の宿題であるため、ツリーを解析するための正しいコードは作成しないでください)。

私はスキャナーを使い果たして、小数点の値を解析する方法しか分からない場合は、ストリームで元のソリューションに戻ります。私は "あなたがこれらの文字の1つを見つけるまで、"私はstream.ReadUntil( "、)")と言うことができるようにするために読んで何かが必要です。小数には常にコンマまたは閉じ括弧が続きます。ハックとして、私はたぶん一度に1つの文字を読むでしょう。これは "test"や "rightTest"のような文字列を取得するのと同じことですが、それは本当にひどいと感じました。

私が知っている唯一のオプションは、文字列トークナイザで何かがわかっていますが、例からわかるように、ファイル全体をトークン化してストリームを使用するという目的を打ち負かす必要があります。これらのファイルは本当に大きくなることがあります。私自身はexersizeと同じように、この割り当てにはまったく問題はありませんが、不要な場合はすべてをメモリに入れないようにしてみたいと思います。

だから基本的に私が探している私は(,:)ときnecesaryをチェックし、またする能力を持つことができるように次の文字を覗くことができるように、ファイルIOの力学上のいくつかの助けであります:までの文字列を読み、:または)

+0

=ファイルのサンプルを提供 –

答えて

2

に10進値を読んあなたはPushbackReaderからjava.ioで見たことがありますか?おしゃべりはその用途の1つです。以下はサンプルです。

PushbackReader pusher = new PushbackReader(reader); 
char c = (char)pusher .read(); 
// code to work with the peeked character 
pusher .unread((int)c); //push character back into the buffer 
+0

ありがとうございますが、それは私がBufferedInputReaderを手に入れたところで私を得ることができます。私は覗くことができますが、TryParseFloat()のようなことはできません。だから私は、文字列または浮動小数点数を必要とする時に、1つの文字を時間ループで書くことに戻ります。 – AaronLS

0

ストリームとスキャナのみが使用できますか?私はMatcherパターンを使用していました。 たとえばこのスニペットは、与えられたHTMLページの文字セットを決定し、その文字セットを使用して、コンテンツの残りの部分をコードする。

BufferedReader in = new BufferedReader(new FileReader(new File("index.html"))); 
String inputLine; 
String returnedContent = ""; 
Pattern charsetPattern = Pattern.compile(".*<meta.*content=\"text/html;.*charset=([A-Za-z0-9\\-]*)\">.*"); 
while ((inputLine = in.readLine()) != null) { 
    if (serviceCharset == null) { 
     Matcher m = charsetPattern.matcher(inputLine); 
     if (m.find()) { 
      charset = m.group(1);//the expression included in the() is one ordered group 
     } 

    } 
    returnedContent += new String(inputLine.getBytes(), charset != null? charset : "UTF8"); 
} 
in.close(); 

私は例があなたの質問とはあまりないを持っている知っている、それだけで示して正規表現がどのように便利ですこの種の問題では、行の後にファイル行を読んで(バッファについての心配がないので)、正規表現を使って必要なテキストとマッチさせます。

0

ファイルをMappedByteBufferにマップして、メモリにバイト配列としてアクセスすることもできます(おおよそ)。また、文字ストリームとして扱う必要がある場合は、CharBufferにラップできます。たとえばを参照してください。 hereマッピングファイルセクション)。