Quais são os aplicativos de exemplo para a ByteBuffer
em Java? Por favor, liste todos os cenários de exemplo onde isso é usado. Obrigado!
java
buffer
bytebuffer
Aklin
fonte
fonte
Respostas:
Esta é uma boa descrição de seus usos e deficiências. Você o utiliza essencialmente sempre que precisa executar E / S rápida e de baixo nível. Se você fosse implementar um protocolo TCP / IP ou se estivesse escrevendo um banco de dados (DBMS), essa classe seria útil.
fonte
A classe ByteBuffer é importante porque forma uma base para o uso de canais em Java. A classe ByteBuffer define seis categorias de operações em buffers de byte, conforme declarado na documentação do Java 7 :
Example code : Putting Bytes into a buffer.
fonte
O Java IO usando APIs orientadas a fluxo é realizado usando um buffer como armazenamento temporário de dados no espaço do usuário. Os dados lidos do disco pelo DMA são primeiro copiados para buffers no espaço do kernel, que são transferidos para o buffer no espaço do usuário. Portanto, há sobrecarga. Evitá-lo pode obter um ganho considerável no desempenho.
Poderíamos pular esse buffer temporário no espaço do usuário, se houvesse uma maneira direta de acessar o buffer no espaço do kernel. O Java NIO fornece uma maneira de fazer isso.
ByteBuffer
está entre os vários buffers fornecidos pelo Java NIO. É apenas um contêiner ou tanque de retenção para ler ou gravar dados. O comportamento acima é alcançado alocando um buffer direto usando aallocateDirect()
API no buffer.A documentação do Byte Buffer em Java tem informações úteis.
fonte
No Android, você pode criar um buffer compartilhado entre C ++ e Java (com o método directAlloc) e manipulá-lo nos dois lados.
fonte
Aqui está um ótimo artigo explicando os benefícios do ByteBuffer. A seguir, são apresentados os principais pontos do artigo:
A seguir, são apresentados benefícios especificamente para ByteBuffer / MappedByteBuffer direto. Observe que buffers diretos são criados fora do heap:
Não afetado pelos ciclos gc : os buffers diretos não serão movidos durante os ciclos de coleta de lixo, pois residem fora do heap. A tecnologia de cache BigMemory da TerraCota parece confiar fortemente nessa vantagem. Se eles estivessem no heap, isso diminuiria o tempo de pausa do gc.
Aumento de desempenho : no IO do fluxo, as chamadas de leitura envolveriam chamadas do sistema, que exigem uma alternância de contexto entre o modo usuário para kernel e vice-versa, o que seria caro, especialmente se o arquivo estiver sendo acessado constantemente. No entanto, com o mapeamento de memória, essa alternância de contexto é reduzida, pois é mais provável que os dados sejam encontrados na memória (MappedByteBuffer). Se os dados estiverem disponíveis na memória, eles serão acessados diretamente sem chamar o SO, ou seja, sem alternância de contexto.
Observe que MappedByteBuffers são muito úteis, especialmente se os arquivos forem grandes e poucos grupos de blocos forem acessados com mais frequência.
fonte