如何打断InputStream中的read方法

read()方法是阻塞式方法,但是接受不到消息总不能让它一直阻塞,求神人指点如何打断这个read方法... read()方法是阻塞式方法,但是接受不到消息总不能让它一直阻塞,求神人指点如何打断这个read方法 展开
 我来答
zjl0000000000
推荐于2017-11-26 · 超过14用户采纳过TA的回答
知道答主
回答量:42
采纳率:100%
帮助的人:38.9万
展开全部

可以先用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. 

追问
你的这种是可以实现的,我是想做服务器,由于字数限制没有讲的很明白,但是作为服务器的话,承载量肯定有问题,,不过得谢谢你教了我一招,谢谢你的耐心讲解。
金山毒霸
2024-10-31 广告
大部分系统错误,是因为某些DLL文件丢失造成的,比如未安装DirectX9或DirectX 9.0组件已损坏、缺少Visual C ++库、未安装.net库。解决方法如下:一、 手动解决方法1、先确定电脑操作系统是多少位的,现在的电脑一般都... 点击进入详情页
本回答由金山毒霸提供
沈阳java
2013-08-05 · TA获得超过1507个赞
知道小有建树答主
回答量:797
采纳率:50%
帮助的人:668万
展开全部
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并不是阻塞方式工作的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Leo分享
2013-08-05 · TA获得超过754个赞
知道小有建树答主
回答量:1405
采纳率:0%
帮助的人:754万
展开全部
inputStream方法不支持打断
你可以重写这个方法
实现相应的效果
我建议直接用多线程挂起
这样不打断也不影响你的使用
追问
我觉得你这种方法切实可行,不过有点复杂,能说的确切点吗?,比如,如何发回read读到的数据等。
追答
byte a = inputStream.read();//方法1
byte b[] = new byte[255];//方法2
inputStream.read(b);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jackylvxg
2013-08-05 · TA获得超过243个赞
知道小有建树答主
回答量:386
采纳率:0%
帮助的人:216万
展开全部
可以直接close掉
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
月牙马马
2013-08-05 · TA获得超过189个赞
知道小有建树答主
回答量:428
采纳率:0%
帮助的人:172万
展开全部
不是很明白 你要做什么?
追问
while(flag){
in = socket.getInputStream();
in.read(data);
}
public void close(){
this.flag = false ;}
接受到close命令时,调用close方法,但是flag虽然赋值为false但是已经
被read阻塞,只有再接收到命令的时候才能关闭,所以想找个方法,能够直接关闭线程
追答
明白了  你用线程会不?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式