2013-03-01 3 views
0

바이트를 새로운 버퍼에 복사하지 않고 단일 인스턴스처럼 보이게 만드는 ByteBuffer 인스턴스의 배열을 래핑하는 java.nio.ByteBuffer 구현을 알고 있습니까?ByteBuffer views

+1

'ByteBuffer' ('Buffer')이 고정 크기입니다. "연결"과 같은 것을 만드는 것은 불가능합니다. 당신은 정말로 무엇을하고 싶습니까? – shuangwhywhy

+0

ByteBuffers에 의존하는 저수준 코드를 최적화하고 발생하는 바이트 복사 수를 줄이는 것이 좋습니다. 자연스럽게 바이트 버퍼간에 바이트를 복사하는 것은 간단하지만, nio 프레임 워크가 발견 한 것처럼 간단합니다. 많은 양의 바이트를 반복해서 저장하면 반복됩니다. –

+0

대용량 ByteBuffer를 한번에 만들어 보시지 않겠습니까? 아니면 그냥 배열을 사용하십시오. – shuangwhywhy

답변

3

구현은 java.nio에는 존재하지 않지만, 거의 모든 채널은 ByteBuffers의 배열을 직접 읽고 쓸 수있는 GatheringByteChannelScatteringByteChannel을 구현합니다.

GatheringByteChannel는 :

long write(ByteBuffer[] srcs)

지정된 버퍼로부터이 채널의 바이트 순서를 쓴다.

ScatteringByteChannel :

read(ByteBuffer[] dsts)

지정된 버퍼에이 채널의 바이트 순서를 읽는다.

위 메소드의 부분 버전도 있습니다 (위 링크 참조).

NIO의 포인트는 가능한 한 낮은 오버 헤드를 가져야하며, 이렇게하는 방법 (별도의 객체가 버퍼를 감싸는 것과 달리)은 간단한 배열보다 많은 오버 헤드가 발생하지 않습니다. 나는 당신과 그 구현을위한 의도 된 유스 케이스라고 생각합니다.

+0

내가 아는 바로는 Netty 내의 Bytes라는 클래스입니다. 슬프게도 ByteBuffer를 확장하지는 않습니다. 채널이 나에게 잘못된 클래스이고, ByteBuffer (채널이 아님)가 필요한 라이브러리를 통해 전달하려고합니다. 이미 바이트를 복사하여이 문제를 해결했지만 많은 바이트가이 시스템을 통해 흐르기 때문에 더 적은 바이트 복사가 발생합니다. 생각해 줘서 고마워. –

+1

라이브러리를 포크하고 메서드를 확장하여 단일 ByteBuffer 대신 ByteBuffer 배열을 허용하지 않는 이유는 무엇입니까? 필자는 읽기와 쓰기를 담당하는 기본 '채널'이 위의 작업을 지원할 것이라고 추측하고 있으며, 작동하려면 몇 줄 이상을 변경할 필요가 없습니다. –

+0

재미있는 아이디어입니다. 고마워요. 나는 그것을 고려하지 않았다. 내 직감은 ByteBuffer를 직접 포장하는 것보다 더 많은 시간이 걸린다는 것입니다. 그러나 나는 그것을 스파이크로 만들어 그것을 인도하는 곳을 보게 될 것이다. 그들은 당신이 기대하는대로 기본 코드가 있다면 나는 단지 운이 좋을지도 모른다. –

1

표준 Java API에는 아무 것도 없습니다. 그리즐리 NIO 프레임 워크는 CompositeBuffer을 가지고 있지만 그것은 래퍼로서 자신의 버퍼의 사용합니다 :

import org.glassfish.grizzly.Buffer; 
import org.glassfish.grizzly.memory.BuffersBuffer; 
import org.glassfish.grizzly.memory.CompositeBuffer;  

.... 

ByteBuffer byteBuffer = ....; 
HeapMemoryManager mm = new HeapMemoryManager(); 
CompositeBuffer buffer = BuffersBuffer.create(); 
Buffer b = mm.wrap(byteBuffer); 
buffer.append(b);