DataInputStream.read()vs DataInputStream.readFully()

Kri*_*son 8 java sockets java-io

我正在制作一个简单的TCP/IP套接字应用程序

这样做有什么不同:

DataInputStream in = new DataInputStream(clientSocket.getInputStream());

byte[] buffer = new byte[100];
in.readFully(buffer);
Run Code Online (Sandbox Code Playgroud)

与这样做:

DataInputStream in = new DataInputStream(clientSocket.getInputStream());

byte[] buffer = new byte[100];
in.read(buffer);
Run Code Online (Sandbox Code Playgroud)

我看了一下文档,他们有完全相同的描述.readFully()并且read() 因此我可以假设它是一回事吗?

Lol*_*olo 12

DataInput.readFully(byte[] b)状态的Javadoc :

从输入流中读取一些字节并将它们存储到缓冲区数组中b.读取的字节数等于b.

DataInputStream.read(byte[] b)状态的Javadoc :

从包含的输入流中读取一些字节数并将它们存储到缓冲区数组中b.实际读取的字节数以整数形式返回.此方法将阻塞,直到输入数据可用,检测到文件结尾或引发异常.

基本上,readFully()会读正好 b.length字节,而read()将读取可达 b.length,也许更少,不管是从输入流.

  • 我可以补充一点,`readFully()`在**网络操作中更好**.我自己在发送长消息时只有`read()`有麻烦(缓冲**超过5K字节**).当只使用`read()时,部分消息丢失并被`?`字符替换.使用`readFully()`解决了我的问题:读取完整的消息,根本没有丢失任何字符.;-) 希望能帮助到你 !;-) (3认同)