System.in available()调用给出了“非法搜索”

时间:2012-07-23 18:55:21

标签: java file-io io

我有类似于以下内容:

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)

......我不知道是什么原因引起的。老实说难倒。群众对如何发生这种情况的想法?

感激地收到任何/所有有用的建议: - )

1 个答案:

答案 0 :(得分: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]
}