2015-02-01 2 views
4

java.nio.ByteBuffer 클래스에는 ByteBuffer.array() 메서드가 있지만이 메서드는 버퍼의 용량이며 사용 된 용량이 아닌 배열을 반환합니다. 이 때문에 나는 꽤 많은 문제가 있습니다.ByteBuffer에서 사용 된 byte []를 얻는 방법

나는 ByteBuffer.remaining()을 사용하면 현재 버퍼에 사용되는 바이트 양을 알게되었으므로 기본적으로 내가 찾고있는 것은 byte[] 만 사용중인 바이트를 얻는 방법입니다. (즉, ByteBuffer.remaining()에 표시되는 바이트

나는 여러 가지 시도를 해봤지만 실패한 것으로 보입니다. 유일한 해결책은 할당 된 크기의 ByteBuffer을 생성하는 것으로 생각할 수 있습니다. 버퍼 잔존하고 필요한 경우 byte[] 할당.

답변

4

Javadocs을 읽으면서 나머지는 현재 위치와 한도 사이의 바이트 수만을 제공한다고 생각합니다.

나머지()

현재 위치와 한계 사이의 요소의 수를 반환.

게다가 :

버퍼의 용량이 포함 된 소자의 수이다. 버퍼의 용량은 절대로 음수가 아니며 결코 변경되지 않습니다.

버퍼 제한은 읽거나 쓰지 않아야하는 첫 번째 요소의 인덱스입니다. 버퍼의 한계는 절대 음수가 아니며 용량보다 클 수 없습니다.

버퍼의 위치는 읽거나 쓸 다음 요소의 인덱스입니다. 버퍼의 위치는 절대 음수가 아니며 절대 값보다 크지 않습니다. 마음에 방법이에 대한 모든 것을 너무

:

static byte[] getByteArray(ByteBuffer bb) { 
    byte[] ba = new byte[bb.limit()]; 
    bb.get(ba); 
    return ba; 
} 

이의 ByteBuffer의 get(byte[] dst) 방법을 사용

공공의 ByteBuffer는 수 (바이트 [] DST)

에게 는

상대 일괄 취득 방법. 이 메서드는 현재의 버퍼로부터 지정된 전송처 배열에 바이트를 전송합니다. src의 형식에서이 메서드를 호출합니다.(A) 호출이이 버그가

src.get(a, 0, a.length) 
+1

정확히 같은 방식으로 작동 얻을, 당신은) (bb.rewind해야한다; 전에 bb.get (ba); 그렇지 않으면 BufferUnderflowException이 발생합니다. 즉, 요청을 충족시키는 데 필요한 것보다 적은 바이트가 버퍼에 남아있는 경우, 즉 length> remaining() 인 경우 바이트가 전송되지 않고 BufferUnderflowException이 발생합니다. –

0

을 (X) 그것에 바이트 쓰기 다음 배열에 바이트를 복사 ByteBuffer.get(byte[]) 또는 ByteBuffer.get(byte[], int, int) 방법을 사용한다. ByteBuffer의 상태에 따라 사용자가 flip해야 할 수도 그것을 먼저

어떤 경우에는 뒷받침을 얻을 수도 있습니다 ByteBuffer에 선하지만, 더 자세한 내용이 있습니다을하지 않는 것이 좋습니다 ...

의의 javadoc는 here입니다.