通过Socket的setSoTimeout方法,可以设置一个超时时间,当read()超过此时间仍无法读取数据,则抛出SocketTimeoutException。 importjava.io.IOException;importjava.io.InputStream;importjava.net.Socket;importjava.net.SocketTimeoutException;publicclassInputStreamExample{publicstaticvoidmain(String[]args){try(Socketsocket...
下面的代码将创建一个可以从标准输入(通常是键盘)读取数据的输入流: BufferedReaderreader=newBufferedReader(newInputStreamReader(System.in));// 创建一个BufferedReader对象,使用System.in作为输入流 1. 2. 3. 读取输入流 接下来,我们可以使用readLine方法来读取输入流。此方法将阻塞,直到用户输入数据并按下回车键...
FileInputStream fosfrom=null;try{intbyteLength=0;bytetemp[] =newbyte[100];intlen=0; fosfrom=newFileInputStream(fromFile); isGetCode.set(false);while(-1!=(len =fosfrom.read(temp))){ System.arraycopy(temp,0,bt,byteLength,len); byteLength=+len; } LogPrint.d(" fosfrom.read "+DataTyp...
在收到此信号之前,对此类流的读取操作可能会阻塞。 例如,来自InputStream的Socket套接字将阻塞,而不是返回 EOF,直到收到设置了 FIN 标志的 TCP 数据包。当从这样的流中接收到 EOF 时,您可以确信在该套接字上发送的所有数据都已可靠地接收到,并且您将无法再读取任何数据。 (另一方面,如果阻塞读取导致异常,一些...
read(byte b[]) 封装了 read(byte b[], int off, int len) 1. 关于InputStream.read() 在从数据流里读取数据时,为图简单,经常用InputStream.read()方法。这个方法是从流里每次只读取读取一个字节,效率会非常低。 更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,in...
Java中的read方法通常是指InputStream类中的read方法,该方法用于从输入流中读取数据。当没有可读取的数据时,read方法会阻塞等待数据的到达。如果需要取消read方法的阻塞,可以通过以下几种方式实现: 设置输入流的超时时间:可以使用InputStream的子类如SocketInputStream、FileInputStream的setSoTimeout方法来设置超时时间。
根据Java api,其InputStream.read()描述为: 如果由于已到达流的末尾而没有字节可用,则返回值-1。此方法将阻塞,直到可用输入数据,检测到流的末尾或引发异常为止。 我有一个while(true)循环进行读取,当流上没有任何内容发送时,我总是得到-1。那是意料之中的。
但是这样也有一个问题,就是如何让程序从这两个方法的阻塞调用中返回。 总结一下,有这么几个方法 1)发送完后调用Socket的shutdownOutput()方法关闭输出流,这样对端的输入流上的read操作就会返回-1。 注意不能调用socket.getInputStream().close()。这样会导致socket被关闭。
所以比较好奇,原生Java输入流(BufferedInputStream或者Scanner)是如何实现阻塞式读取控制台中用户输入的数据的? importjavax.swing.*;importjava.io.*;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[] args)throwsIOException {FileInputStreamfdIn=newFileInputStream(FileDescriptor.in);Scannerin=new...