#java #communication #bytearray #rmi #aio
#java #Информационные материалы #массивы #rmi #aio
Вопрос:
Позвольте мне представить мою ситуацию.
У меня много данных в байтах, хранящихся в файлах на сервере. Я пишу и читаю эти файлы, используя AIO, который поставляется в JDK7. Таким образом, я использую ByteBuffer (ы) для операций чтения и записи.
Вопрос в том, что после того, как я выполнил чтение в AsynchronousFileChannel, я хочу передать содержимое ByteByffer, которое использовалось в операции чтения, клиенту. Таким образом, я действительно хочу отправить байты.
Каков был бы наилучший способ начать отсюда. Я не хочу отправлять ByteBuffer, потому что у меня есть их пул, который я повторно использую, поэтому это не вариант. Я хочу также иметь возможность, возможно, даже комбинировать несколько операций чтения и отправлять содержимое нескольких байтовых буферов одновременно.
Итак, что мне отправить. Просто массив byte[]? Или мне нужен какой-то поток? Каким будет лучшее решение в отношении производительности здесь.
Я использую RMI для связи.
Заранее благодарю.
Комментарии:
1. переназначил ваш вопрос с помощью java. Больше шансов получить ответ таким образом.
2. Если производительность критична, я бы не использовал стандартный Java RMI. Все остальное, что вы делаете, вряд ли что-то изменит. Если вам нужно использовать Java RMI, я бы не слишком беспокоился о производительности. 😉
Ответ №1:
Вы можете имитировать потоки через rmi, используя библиотеку RMIIO, которая позволит вам передавать произвольное количество байтов через RMI, не вызывая проблем с памятью на обоих концах.
(отказ от ответственности, я написал библиотеку)
Ответ №2:
Если нет очень веской причины не делать этого, тогда просто отправьте массив байтов вместе с достаточным количеством метаданных, чтобы вы могли обеспечить надежное обслуживание.
Чем меньше базовой реализации вам нужно передавать туда и обратно через RMI, тем лучше. Особенно когда вы работаете с Java 7, которая еще не является общедоступной.
Комментарии:
1. На самом деле нет веской причины не делать этого. Я думаю, что я пойду этим путем, потому что он самый простой и не требует привлечения какого-либо другого компонента / библиотеки / чего-либо еще.
Ответ №3:
Чтобы использовать RMI, вы должны извлечь содержимое буфера в виде byte[]
, затем записать его в ObjectOutputStream
(запись происходит под прикрытием). Предполагая, что в данный момент вы используете прямые буферы, это означает процессорное время для создания массива в куче Java и процессорное время для сбора мусора из этого массива после его записи, а также возможность того, что поток будет удерживать ссылку слишком долго, вызывая ошибку нехватки памяти.
На мой взгляд, лучшим подходом является открытие SocketChannel
по назначению и использование его для записи содержимого буфера. Конечно, для выполнения этой работы вам нужно будет записать дополнительные данные, описывающие размер буфера, и это, вероятно, превратится в протокол связи.