Java BufferedInputStream和Blocking

Java BufferedInputStream和Blocking,java,sockets,bufferedinputstream,Java,Sockets,Bufferedinputstream,我正在使用BufferedInputStream从套接字读取数据。BufferedInputStream的内容如下: socketInput.read(replyBuffer, 0, 7); 它由 socketInput = new BufferedInputStream(mySocket.getInputStream()); mySocket定义为私有套接字mySocket mySocket由mySocket=newsocket(ipAddress,port)实例化 我已验证mySocke

我正在使用
BufferedInputStream
从套接字读取数据。
BufferedInputStream
的内容如下:

socketInput.read(replyBuffer, 0, 7);
它由

socketInput = new BufferedInputStream(mySocket.getInputStream());
mySocket
定义为
私有套接字mySocket

mySocket
mySocket=newsocket(ipAddress,port)实例化

我已验证
mySocket
是否已连接到我的设备。我可以向我的设备发送数据;但是,由于未知的原因,我没有收到来自设备的信息,但这不是问题所在


我希望我的
BufferedInputStream
在100毫秒后返回,如果它没有读取任何数据。是否可以设置
BufferedInputStream
来执行此操作?现在,它会无限期地阻塞。

使用缓冲流从套接字读取数据通常是个坏主意,正是因为这个原因:如果它看不到足够的数据来填充其内部缓冲区(将大于7个字符!),它将永远等待,无法使其超时。直接使用
SocketInputStream
,问题就会消失。

为套接字指定100毫秒超时

如果您想要任何类型的非阻塞或超时I/O,您应该使用NIO(
java.NIO
)类,而不是
java.io
中的内容。如果我使用的是BufferedInputStream,这仍然有效吗?将会发生的是,您将从
read()
调用中获得
SocketTimeoutException
,即使实际上有足够的字节来满足您的请求。这不好。@Code Monkey它对任何包装输入流仍然有效。@Ernest Friedman Hill SocketTimeoutException在没有可用数据时抛出。所以您建议改为socket.getInputStream.read(..)?是的,就是这样。然后,您可以按照另一张海报的建议,使用
setSoTimeout()
,您将获得所需的行为。