如何打断InputStream中的read方法
read()方法是阻塞式方法,但是接受不到消息总不能让它一直阻塞,求神人指点如何打断这个read方法...
read()方法是阻塞式方法,但是接受不到消息总不能让它一直阻塞,求神人指点如何打断这个read方法
展开
5个回答
展开全部
可以先用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 广告
2024-10-31 广告
大部分系统错误,是因为某些DLL文件丢失造成的,比如未安装DirectX9或DirectX 9.0组件已损坏、缺少Visual C ++库、未安装.net库。解决方法如下:一、 手动解决方法1、先确定电脑操作系统是多少位的,现在的电脑一般都...
点击进入详情页
本回答由金山毒霸提供
展开全部
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并不是阻塞方式工作的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
inputStream方法不支持打断
你可以重写这个方法
实现相应的效果
我建议直接用多线程挂起
这样不打断也不影响你的使用
你可以重写这个方法
实现相应的效果
我建议直接用多线程挂起
这样不打断也不影响你的使用
追问
我觉得你这种方法切实可行,不过有点复杂,能说的确切点吗?,比如,如何发回read读到的数据等。
追答
byte a = inputStream.read();//方法1
byte b[] = new byte[255];//方法2
inputStream.read(b);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以直接close掉
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不是很明白 你要做什么?
追问
while(flag){
in = socket.getInputStream();
in.read(data);
}
public void close(){
this.flag = false ;}
接受到close命令时,调用close方法,但是flag虽然赋值为false但是已经
被read阻塞,只有再接收到命令的时候才能关闭,所以想找个方法,能够直接关闭线程
追答
明白了 你用线程会不?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询