大字节数组传输到客户端

时间:2011-04-19 15:41:52

标签: java communication bytearray rmi aio

让我介绍一下我的情况。

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

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

从这里开始的最佳方式是什么?我不想发送ByteBuffer,因为我有一个我重用的池,因此这不是一个选项。我希望能够甚至组合几个读取并一次发送几个ByteBuffer的内容。

那我该发什么呢。只是一个byte []数组?或者我需要一些流?什么是关于性能的最佳解决方案。

我正在使用RMI进行通信。

提前完成。

3 个答案:

答案 0 :(得分:1)

您可以使用RMIIO库模拟rmi上的流,这将允许您通过RMI流式传输任意数量的字节,而不会在任何一端导致内存问题。

(免责声明,我写了图书馆)

答案 1 :(得分:0)

除非有充分的理由不这样做,否则只需发送字节数组以及足够的元数据即可提供可靠的服务。

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

答案 2 :(得分:0)

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

在我看来,更好的方法是向目的地打开SocketChannel并使用它来编写缓冲区的内容。当然,要完成这项工作,您需要编写描述缓冲区大小的其他数据,这可能会演变为通信协议。