2012-01-31 12 views
0

PushbackInputStreamから数値(整数、倍数、正数、負数など)を読み取る必要があります。私はバイト単位で読み込み、それらが0-9の間にあるかどうかをテストしなければならないのでしょうか?Java PushbackInputStreamを使用して数値を読み取る方法

ストリーム内の残りの部分を空白を区切りとして文字列配列に読み込むにはどうすればよいですか?

編集

私は自分自身をもう少し明確にしましょう。演算子と数値を含む式の解析をしたい。私はおそらく(あなたの良い方法はありませんか?)オペレータの代わりに番号の部分に遭遇するたびにPushbackInputStreamを使用する必要があります。この場合、誤って読み取った番号の部分を未読/プッシュバックします。例えば、私は "10 + 20 * 30"を解析したいと思いますが、私はを読んでいます。これは私の演算子のenumにはありません。私はそれを返して、PushbackInputStreamの数字を読みとろうとします。だからここでそれをする方法?

+0

これほど多くの簡単な方法があります。私はそのクラスの必要性を見たことがありません。 – Bill

答えて

1

この目的のために、Scannerクラスを使用できます。

Scanner sc = new Scanner(_psi_); 
int i = sc.nextInt(); 

ザ・スキャナは、他のデータ型を読み取るためのメソッドをもつ。

http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

使用しPushbackInputStreamから単一整数を読み取るために、このコードは、PSI呼ばれます。

Scanner sc = new Scanner(_psi_); 
List<Integer> ints = new ArrayList<Integer>(); 
while(sc.hasNextInt()) 
    ints.add(sc.nextInt()); 

Integer[] theIntArray = ints.toArray(new Integer[]); 

EDIT:あなたはテキストファイルからint型のの(小)、未知の番号を読みたい場合は、あなたがこのようなものを使用することができます別の方法としては、個々の文字を読むことができる(私はそのためにInputStreamReaderを使用したいです)あなたが番号の一部を持っているかどうかを確認してください。数値の一部であれば、文字列(*)の最後に現在の文字を追加します。演算子が表示されたら、Integer.parseInt()などで一度にStringを解析します。

(*)個々の文字を追加して文字列を作成することは非常に遅いため、慣れていません。通常、StringBuilderを使用する方が適切です。

+0

事実:私はそれをScannerに変換した後にPushbackInputStreamに戻る方法がわかりません。例えば、 '-45.3 * 27-24'を読み込み/解析したいのですが、最初に' -45.3'を先読みする必要があります。その後、 '*'、おそらくは '2'を読み込みますが、私はそれをストリームに戻します。そして、私は '27'などを読む必要があります... –

+0

@littleEinstein申し訳ありませんが、私はあなたが正確に行うことを計画しているものは得られません。 '*'と '2'をプッシュバックしますか?これの目的は何ですか? – mtsz

+0

私はいくつかの解析をしようとしています。私は演算子を知るためにcharでcharを読み込む必要がありますが、便宜上数値を全体として読みたいと思っています。たぶん私はバイトを読んでバイト[]に格納し、文字列を埋めるために配列を使用し、Integer.valueOfなどを使用して番号を取得する必要があります。 –

0

あなたはこのようPushbackInputStreamから読み取ることができます。

byte buf[]; // some buffer 
ByteArrayInputStream in = new ByteArrayInputStream(buf); 
PushbackInputStream f = new PushbackInputStream(in); 
int c; 
while ((c = f.read()) != -1) { 
    if (Character.isDigit(c)) { 
    int d = f.read(); 
    if (matchesSomeCondition(d)) { 
     doSomethingInteresting(c, d); 
    } else { 
     f.unread(d); 
    } 
    } 
} 

PushbackInputStreamの面白いところは、あなたがパターンを探すために好きなようにあなたに多くのバイトをストリームに覗き見できること、です。パターンが一致しない場合は、unreadメソッドを使用して、その中にバイトパックをプッシュします。

+0

は 'int d = f.read();'ではなく、1バイトの数字、つまり1桁の数字だけを読み込みますか? –

+0

はい、そうですが、 'd = f.read()'でもう1つ読むと、スペースなどの区切り文字にすることができます。私はちょうどあなたが何をしたいのか分からないので(あなたは異なる数字の種類を言います)...あなたが*プッシュバックを使うことを望むとき、それがどのように働くかということをあなたが望むだけです。 – mtsz

+0

私はもちろん、プッシュバックの仕組みを知っています。しかし、可能であれば、この機能を組み合わせて一度に数字を読むことも望みます。または少なくとも、それを行うためのいくつかの短い/素敵なコード。 –

関連する問題