让我介绍一下我的情况。
我在服务器上的文件中存储了大量的字节数据。我正在使用JDK7中的AIO编写和读取这些文件。因此,我使用ByteBuffer进行读写操作。
问题是,一旦我在AsynchronousFileChannel上执行了读操作,我想将读操作中使用的ByteByffer的内容传输到客户端。因此我实际上想发送字节。
从这里开始的最佳方式是什么?我不想发送ByteBuffer,因为我有一个我重用的池,因此这不是一个选项。我希望能够甚至组合几个读取并一次发送几个ByteBuffer的内容。
那我该发什么呢。只是一个byte []数组?或者我需要一些流?什么是关于性能的最佳解决方案。
我正在使用RMI进行通信。
提前完成。
答案 0 :(得分:1)
您可以使用RMIIO库模拟rmi上的流,这将允许您通过RMI流式传输任意数量的字节,而不会在任何一端导致内存问题。
(免责声明,我写了图书馆)
答案 1 :(得分:0)
除非有充分的理由不这样做,否则只需发送字节数组以及足够的元数据即可提供可靠的服务。
通过RMI来回传输所需的底层实现越少越好。特别是当您使用尚未普遍使用的Java 7时。
答案 2 :(得分:0)
要使用RMI,您必须以byte[]
的形式检索缓冲区的内容,然后将其写入ObjectOutputStream
(写入发生在封面下)。假设您当前正在使用直接缓冲区,这意味着在Java堆中创建数组的CPU时间,以及在编写该数组后对其进行垃圾收集的CPU时间,以及流将保留在引用上的可能性太长,导致内存不足错误。
在我看来,更好的方法是向目的地打开SocketChannel
并使用它来编写缓冲区的内容。当然,要完成这项工作,您需要编写描述缓冲区大小的其他数据,这可能会演变为通信协议。