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 回答