2011-04-29 5 views
2

파일이 있는데 'FileChannel.map()'을 통해 메모리에 매핑됩니다. 문자열을 읽을 때 그러나 다음을 수행하는 조금 이상한 것 같다메모리 맵을 문자열로 직접 변환

1) read a int for the string length 
2) allocate a byte[length] object 
3) use .get to read length bytes 
4) convert the byte[] to a string 

는 지금은 메모리 파일이 메모리에 대한 포인터로 사용자에게 부여 매핑 나의 C++ 배경을 알고있다. 바이트 배열을 사용하지 않고 문자열 변환을 매핑 된 메모리에서 바로 수행하는 좋은 방법이 있습니까?

+0

파일이 유니 코드입니까? –

+0

그 시점에서 결정되어야합니다. 현재는 ASCII입니다. –

답변

3

내가 제안 :이 방법으로 문자를 mapped.asCharBuffer을 (사용) 및 얻을 수도 있습니다

MappedByteBuffer mapped = fileChannel.map(mode, position, size); 
String s = new String(mapped.array()); 

.

+0

버퍼에 불필요한 복사를 방지하기 위해 이렇게하는 방법입니다. 물론 rlibby가 언급했듯이 여전히 문자열을 만드는 것은 사본을 포함합니다. –

+0

... 그가'UnsupportedOperationException'을 얻을 수 있도록? 'MappedByteBuffer'는 배열에 의해 지원되지 않습니다.'MappedByteBuffer.hasArray()'는'false'를 리턴하고,'MappedByteBuffer.array()'는 위 예외를 던집니다. – rlibby

+0

사실 일 수 있으므로 그는 asCharBuffer()를 사용하고 각 char을 다른 버퍼로 읽어 와서 문자열을 생성해야합니다. – Pih

3

궁극적으로, 아니요. 그러나 데이터를 문자로 볼 수있는 방법이 있습니다. ByteBuffer.asCharBuffer()를보십시오.

내부적으로 asCharBuffer() 메서드는 제안하는 것과 동일한 작업을 char 단위로 수행합니다.

+0

자바 문자열이 유니 코드이기 때문에 파일이 ASCII 인 경우 그가 원하는 최선의 방법입니다. –

1

데이터의 비공개 사본을 원할 경우 String이 발생하지 않습니다. 문자열은 변경되지 않으며 공유 배열을 사용하는 경우이를 깨뜨릴 수 있습니다. 아쉽게도 String(CharSequence) 또는 String(ByteBuffer) 생성자가 없습니다.