Java 大字节数组传输到客户端

Java 大字节数组传输到客户端,java,communication,bytearray,rmi,aio,Java,Communication,Bytearray,Rmi,Aio,让我介绍一下我的情况 我有很多字节的数据存储在服务器上的文件中。我正在使用JDK7中的AIO编写和读取这些文件。因此,我使用ByteBuffer进行读写操作 问题是,一旦我在AsynchronousFileChannel上执行了读取,我想将读取操作中使用的ByteByfer的内容传输到客户端。因此,我实际上想要发送字节 从这里开始最好的方式是什么。我不想发送ByteBuffer,因为我有一个可重用的ByteBuffer池,因此这不是一个选项。我想能够甚至可以结合几次阅读,同时发送多个ByteBu

让我介绍一下我的情况

我有很多字节的数据存储在服务器上的文件中。我正在使用JDK7中的AIO编写和读取这些文件。因此,我使用ByteBuffer进行读写操作

问题是,一旦我在AsynchronousFileChannel上执行了读取,我想将读取操作中使用的ByteByfer的内容传输到客户端。因此,我实际上想要发送字节

从这里开始最好的方式是什么。我不想发送ByteBuffer,因为我有一个可重用的ByteBuffer池,因此这不是一个选项。我想能够甚至可以结合几次阅读,同时发送多个ByteBuffer的内容

那我该送什么呢。只是一个字节[]数组?还是我需要一些小溪?关于性能,这里的最佳解决方案是什么

我使用RMI进行通信


Thanx提前发送。

除非有很好的理由不发送,否则只需发送字节数组以及足够的元数据,即可提供可靠的服务


您需要在RMI上来回传输的底层实现越少越好。特别是当您使用尚未普遍可用的Java 7时。

要使用RMI,您必须以
字节[]
的形式检索缓冲区的内容,然后将其写入
对象输出流
(写入发生在封面下)。假设您当前使用的是直接缓冲区,这意味着在Java堆中创建数组所需的CPU时间,以及写入数组后垃圾收集该数组所需的CPU时间,以及流保留引用的时间过长,从而导致内存不足错误的可能性


在我看来,更好的方法是打开一个
SocketChannel
到目标,并使用它来写入缓冲区的内容。当然,要实现这一点,您需要编写描述缓冲区大小的附加数据,这可能会演变为一种通信协议。

您可以使用库模拟rmi上的流,这将允许您通过rmi流传输任意数量的字节,而不会在两端造成内存问题


(免责声明,我编写了库)

用java重新标记您的问题。如果性能至关重要,我就不会使用标准的JavaRMI。你做的任何其他事情都不可能有什么不同。如果您必须使用JavaRMI,我不会太担心性能事实上,没有理由不这样做。我想我会这样做,因为它是最简单的,并且不需要涉及其他组件/库/什么。