如何打断InputStream中的read方法

read()方法是阻塞式方法,但是接受不到消息总不能让它一直阻塞,求神人指点如何打断这个read方法

可以先用available()方法判断可以读取多少内容,再读取。这样避免read()方法发生阻塞。


例:

public void test(InputStream in){
    byte[] bs=new byte[1024];
    while(true){
    try {
        int available=in.available();// 可读取多少字节内容
        if(available==0){// 没有可读取内容则退出
            break;
        }else{// 读取内容并输出
            in.read(bs,0,available);
            System.out.print(new String(bs,0,available));
        }
        Thread.currentThread().sleep(200);// 睡眠一段时间
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

available()的说明有一段话,很迎合你现在的问题:

Firstly, the guarantee is "without blocking for more input" rather than
"without blocking": a read may still block waiting for I/O to complete — the
guarantee is merely that it won't have to wait indefinitely for data to be
written. The result of this method should not be used as a license to do I/O on
a thread that shouldn't be blocked. 

追问

你的这种是可以实现的,我是想做服务器,由于字数限制没有讲的很明白,但是作为服务器的话,承载量肯定有问题,,不过得谢谢你教了我一招,谢谢你的耐心讲解。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-05
InputStream是一个抽象类,本身并没有实现read方法。read方法在具体的子类中实现,例如FileInputStream继承了InputStream,那么就实现了read方法来读取文件中的数据。而read方法并不是阻塞方式的,会直接读取数据。不知道你说的InputStream中的read是阻塞方式工作的是InputStream的哪一个具体子类?追问

socket.getInputStream();就是这个输入流,我也不知道具体是哪个

追答

Socket也不是流是阻塞的啊!
ServerSocket ss = new ServerSocket(1234);
Socket socket=server.accept(); //这条语句是阻塞方式工作的,和流没有关系,服务端负责监听端口,这个时候等待客户端的连接。如果有客户端连接,就会创建一个表示客户端的Socket对象。下面就可以通过socket获得输入流来读取数据了。
而流InputStream并不是阻塞方式工作的。

第2个回答  2013-08-05
inputStream方法不支持打断
你可以重写这个方法
实现相应的效果
我建议直接用多线程挂起
这样不打断也不影响你的使用追问

我觉得你这种方法切实可行,不过有点复杂,能说的确切点吗?,比如,如何发回read读到的数据等。

追答

byte a = inputStream.read();//方法1
byte b[] = new byte[255];//方法2
inputStream.read(b);

第3个回答  2013-08-05
可以直接close掉
第4个回答  2013-08-05
不是很明白 你要做什么?追问

while(flag){
in = socket.getInputStream();
in.read(data);
}
public void close(){
this.flag = false ;}
接受到close命令时,调用close方法,但是flag虽然赋值为false但是已经
被read阻塞,只有再接收到命令的时候才能关闭,所以想找个方法,能够直接关闭线程

追答

明白了 你用线程会不?

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网