0

让我介绍一下我的情况。

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

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

从这里出发的最佳方式是什么。我不想发送 ByteBuffer,因为我有一个可以重复使用的池,因此这不是一个选项。我甚至希望能够组合多个读取并一次发送多个 ByteBuffer(s) 组合的内容。

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

我正在使用 RMI 进行通信。

提前谢谢。

4

3 回答 3

1

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

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

于 2011-04-19T17:12:00.953 回答
0

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

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

于 2011-04-19T15:48:52.623 回答
0

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

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

于 2011-04-19T16:11:22.977 回答