2017-04-14 3 views
0

바이트를 직접 ByteBuffer로 읽은 다음 원래 버퍼를 byte [] 배열로 다시 래핑하지 않고 디코드하여 메모리 할당을 최소화하려고합니다.Java direct ByteBuffer - 문자 디코드

따라서 힙에 새 배열을 할당 할 때 StandardCharsets.UTF_8.decode()을 사용하지 마십시오.

바이트를 디코딩하는 방법에 붙어 있습니다. 문자열을 버퍼에 쓴 다음 id를 다시 읽는 다음 코드를 생각해보십시오.

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(2 << 16); 

byteBuffer.put("Hello Dávid".getBytes(StandardCharsets.UTF_8)); 

byteBuffer.flip(); 

CharBuffer charBuffer = byteBuffer.asCharBuffer(); 
for (int i = charBuffer.position(); i < charBuffer.length(); i++) { 
    System.out.println(charBuffer.get()); 
} 

코드 출력 :

䡥汬漠 

가 어떻게 버퍼를 디코딩 할 수 있습니까?

+2

'ByteBuffer'가 아닌 'CharBuffer'를 뒤집어 야합니다. 'CharBuffer'는 반전 된 상태를 상속받습니다. – EJP

답변

1

CharBuffer의 인코딩을 지정할 수 없습니다. 여기 참조 : 또한 What Charset does ByteBuffer.asCharBuffer() use?

, 버퍼를 변경할 수 있기 때문에, 나는 ... 당신이 이제까지 가능성이 항상 메모리 재 할당을하지 않고 불변 그것에서 String를 만들 수 표시되지 않습니다

+0

감사합니다. 존,하지만 내 질문은 여전히 ​​유효합니다. 추가 메모리 할당없이 직접 ByteBuffer에서 문자를 어떻게 디코딩 할 수 있습니까? –

+0

당신의 질문은'직접 CharBuffer에서 인코딩을 어떻게 지정할 수 있습니까? '입니다 ... – john16384

+0

IMHO 이것은 주석이 아니어야하며 중복 투표는 anwser가 아니어야합니다. – glee8e

1

바이트를 직접 ByteBuffer로 읽어 들인 다음 원래 버퍼를 byte [] 배열로 다시 래핑하지 않고 메모리 할당을 최소화하기 위해 디코드하려고합니다.

ByteBuffer.asCharBuffer() 실제로 두 래퍼 모두 동일한 기본 버퍼를 공유하므로 사용자의 필요에 맞습니다.

이 방법의 javadoc 말한다 :

새로운 버퍼의 위치는 0, 그렇지 않을지라도 그 용량 한계 두

나눈 버퍼에 남아있는 바이트 수있을 것이다 명시 적으로 말하면, CharBuffer은 주어진 버퍼에서 UTF-16 문자 인코딩을 사용한다는 힌트입니다. charbuffer가 사용하는 인코딩을 제어 할 수 없으므로 더 많은 선택의 여지가 없으며 인코딩에 문자 바이트를 반드시 써야합니다.

byteBuffer.put("Hello Dávid".getBytes(StandardCharsets.UTF_16)); 

인쇄에 관한 한 가지가 루프 for입니다. CharBuffer.length()은 실제로 버퍼의 위치와 한계 사이의 남은 문자 수이므로 CharBuffer.get()으로 전화하면 줄어 듭니다. 따라서 get(int)을 사용하거나 for 종료 조건을 limit()으로 변경해야합니다.