如何实现 ObjectInputStream::read 函数的返回值

How to realize the ObjectInputStream::read function's return value

提问人:Krlin Homon 提问时间:10/16/2023 最后编辑:Mark RotteveelKrlin Homon 更新时间:10/16/2023 访问量:35

问:

使用Java套接字传输文件时,我设置了,用来接收文件流,但是返回值总是1024,为什么不是。byte[] BUFFER = new byte[1024 * 8]objectInputStream.read(BUFFER, 0, BUFFER.length)objectInputStream.read(BUFFER, 0, BUFFER.length)10241024 * 8

enter image description here

BUFFER 长度为 1024 * 8

enter image description here

但 Len 是 1024 岁。

Java IO 对象输入流

评论

0赞 Mark Rotteveel 10/16/2023
如果要传输字节数组,为什么要首先使用 an?仅当要使用 Java 二进制序列化格式传输对象时,才应使用 An。顺便说一句,每次写完后打电话对我来说毫无意义。ObjectInputStreamObjectInputStreamflush

答:

3赞 Mark Rotteveel 10/16/2023 #1

最多返回 1024 的原因是内部使用了 1024 字节的缓冲区(尽管这是一个实现细节,因此在不同的 Java 版本或发行版中可能会有所不同)。A 不需要返回请求的字节数,因此 A 将返回其当前缓冲区中可用的字节数,或者从其上游输入流请求 1024 个字节并返回该字节数。readObjectInputStreamreadObjectInputStream

但是,正如我在评论中提到的,从您在问题中显示的代码片段来看,您可能根本不应该使用 an。您正在传输使用 获取的二进制数据,这意味着您没有在所示代码中使用 Java 序列化。也许您应该改用正常的输入和输出流(也就是说,也许您确实在较早的时候使用了序列化,尽管在单个流中结合序列化和正常二进制传输通常很奇怪)。ObjectInputStreamread

评论

0赞 Krlin Homon 10/16/2023
谢谢你,原因是我需要在转换字节数组之前转换文件的其他信息。该文件的其他信息是一个名为 java bean,其中包含 fileName、fileLength 和有关该文件的其他信息。所以我使用 ObjectInputStream::readObject 来接收 bean。为了解决这个问题,如果可以,我可以考虑使用 ObjectInputStream 读取 bean 和 DataInputStream 读取字节数组。FileTransModel
0赞 Mark Rotteveel 10/16/2023
@KrlinHomon 如果您不打算使用 .为此,请使用正常的输入流。也就是说,您可以继续使用 ,但您必须接受这样一个事实,即您只能读取 1024 字节的块。在这种情况下,请减小缓冲区的大小,并在每次写入后删除对的调用,以便您真正从缓冲输出流的缓冲区中受益!DataInputStreamDataInputStreamObjectInputStreamflush()
0赞 Krlin Homon 10/16/2023
学到了,非常感谢