1

私は次のようなものを持っています:

public class X extends Thread{
    BufferedInputStream in = (BufferedInputStream) System.in;
    public void run() {
        while (true) {
            try {
                while (in.available() > 0) {
                  // interesting stuff here
                }
            } catch (Exception e) {
                e.printStackTrace();
            }                   
        }
    }
}

...これは大部分は機能しますが、stderrで次のように表示されることがあります(一度発生すると絶え間なく繰り返されるようです-これが発生し始めると、アプリケーションは最終的にクラッシュすると思います):

java.io.IOException: Illegal seek
    at java.io.FileInputStream.available(Native Method)
    at java.io.BufferedInputStream.available(BufferedInputStream.java:381)
    at compactable.sqlpp.X.run(X.java:40)

...そして私にはこれを引き起こす原因がわかりません。正直なところ困惑しました。これがどのように起こり得るかについての大衆からのアイデアはありますか?

ありがたいことに受け取った/すべての有用な提案:-)

4

1 に答える 1

1

ストリームが閉じられている場合は、IOException呼び出しを利用できます。

また、available()は、ストリームの読み取りに残っている量を通知しません。ストリームが空の場合は、ブロックせずに読み取ることができる量のみを通知します(基本的にはストリームにさらに追加されるのを待ちます)。読み取りが-1を返すまで読み取ります。

int c;
while ( (c = in.read()) != -1 ) {
  // do stuff
}

また

int readLength;
byte[] buffer = new byte[1024];
while ( (length = in.read(buffer) != -1) {
  // do stuff with buffer, it now has bytes in buffer[0] to buffer[readLength-1]
}
于 2012-07-24T06:38:00.537 に答える