2013-12-10 3 views
1
나는 패키지를 java.nio의 사용 자바에서 메모리 매핑 된 스트림을 구현하고

로 출력 파일을 생성합니다. 메모리 덩어리를 출력 파일에 매핑하고 출력 파일에 더 많은 요소를 작성해야 할 때 다른 덩어리를 매핑하는 등의 작업을 수행합니다.메모리 매핑 된 출력 스트림은 후행 0

w_buffer = channel.map(FileChannel.MapMode.READ_WRITE, w_cycle*bufferSize, bufferSize); 

내 구현은 요소의 총 양을 한 번에 파일에 매핑 된 덩어리의 크기의 배수가 파일에 있습니다 쓸 수 원활하게 작동합니다. 이없는 경우 그러나, 경우는 스트림/결정 또한 사용자는 후행 0의 형태로 파일에 덤프 매핑 된 덩어리에 공간이 남아 writing- 중지시기를 알 수없는 자주 있기 때문에 경우되지 않습니다 인격적으로. 출력 파일에서 이러한 후미 0을 피하는 방법은 무엇입니까?

미리 감사드립니다.

답변

1

당신은 channel.truncate (크기)를 사용하여 주어진 크기에 채널을자를 수 있지만, 이것이 channel.map와 함께 이식 작업을 것이라고 의심 스럽다(). 많은 channel.map은 기본 운영 체제에 의존합니다. 일반적으로 "파일 액세스"와 "메모리 매핑 된 액세스"를 같은 파일에 혼합하는 것은 좋지 않습니다. 다른 솔루션은 각 청크 시작 부분에 "크기 사용"값을 가질 수 있습니다. 후반 코멘트

+0

죄송합니다. 이전 방식은 괜찮아 보입니다. 나는 절단 할 수있는 그러한 기능의 유용성을 알지 못했다. 그러나, 그것은 오류 다음 나에게 제공합니다 요청한 작업이 파일 매핑 인스턴스화해야 메모리 바이트 버퍼보다 ​​다른 중간 버퍼를 (필요하기 때문에 개방 두 번째 솔루션은 이상한 소리를 사용자가 매핑 한 구역이있는 파일을 수행 할 수 없습니다 몇개의 요소를 거기에 격납하기 전에), 몇개의 요소를 매핑 할까를 알기 위해서 (때문에) 필요합니다. – bfaskiplar

+0

음, 두 번째 방법은 잘라야의 첫 번째 전화 해야지는 방법 - 여기 내 목적은 신뢰할 수없는 만드는 다른 플랫폼에 다른 동작이 발생할 수 있지만 완벽하게 작동합니다. 감사! – bfaskiplar

관련 문제