Java的输入流中的read(byte[] b)方法

public int read(byte[] b)

         throws IOException

从一个输入流中读取一定数量的字节,并将这些字节存储到其缓冲作用的数组b中。这个函数会返回一次性读取的字节数。

这个函数是一个阻塞式的函数,当它读到有效数据、确认的文件尾(EOF)或者抛出一个异常时它才会执行其他语句,否则一直停在read()函数处等待。比如下面的列子:

ServerSocket server = new ServerSocket(port)
Socket client = server.accept();
BufferedInputStream bis = new BufferedInputStream(client.getInputStream);
byte[] box = new byte[1024];
int len = 0;
while(-1!=(len = bis.read(box))) {
    System.out.println(len);
    String msg = new String(box, 0, len);
}语句1;语句二;

在这种情况下,当从客户端接收了一条信息并转成msg字符串后,while循环会又回到read()函数,不会跳出循环执行语句一和二。因为这时read()函数并没有遇到文件尾或者抛出异常,所以下一次while条件判断read()函数会一直等待有效数据的输入,而不是返回-1。此时整个程序将会阻塞在这里。

如果我们是从文件用这个函数以这种while循环方式读取数据的话并不会遇到这个问题,因为读到最后会遇到EOF的。如果用这种方式读取控制台的输入的话,我们可以选择不要while循环。或者设置条件跳出循环,即如果len小于box的长度话就跳出循环。我们还可以选择用DataInputStream的readUTF()函数也可以。还有就是我们可以采用监听机制,当监听到输入流中有数据之后再读取。



  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值