문제

나는 많은 I/O를 수행 해야하는 매우 빠른 Java 코드를 작성하려고 노력했습니다. 바이트 버퍼를 반환하는 메모리 매핑 파일을 사용하고 있습니다.

public static ByteBuffer byteBufferForFile(String fname){
    FileChannel vectorChannel;
    ByteBuffer vector;
    try {
        vectorChannel = new FileInputStream(fname).getChannel();
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
        return null;
    }
    try {
        vector = vectorChannel.map(MapMode.READ_ONLY,0,vectorChannel.size());
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
    return vector;
}

내가 가진 문제는 바이 테버. array () 메소드 (바이트 [] 배열을 반환해야한다)가 읽기 전용 파일에서 작동하지 않는다는 것입니다. 메모리로 구성된 메모리 버퍼와 디스크에서 읽은 버퍼로 작동하도록 코드를 작성하고 싶습니다. 그러나 나는 모든 버퍼를 bytebuffer.wrap () 함수를 감싸고 싶지 않습니다. 그래서 나는 두 가지 버전의 모든 버전을 쓰고 있는데, 하나는 바이트 []를 취하고 다른 하나는 바이트 버퍼를 취합니다.

모든 것을 포장해야합니까? 아니면 모든 것을 이중으로 작성해야합니까?

도움이 되었습니까?

해결책

실제로 누구든지 확인 했습니까? ByteBuffers 메모리 매핑 지원으로 생성됩니다 .array() 처음에 Readonly/Readwrite에 관계없이?

내가 말할 수있는 한, 내 찌르기에서 대답은 아니. ㅏ ByteBuffer직접 반환 능력 byte[] 배열을 통해 ByteBuffer.array() 존재에 의해 주관됩니다 ByteBuffer.hb (byte[]), 이것은 항상 null로 설정됩니다. MappedByteBuffer 생성됩니다.

질문 저자가하고 싶은 일과 비슷한 일을하기를 바랐기 때문에 어떤 것이 나를 짜증나게합니다.

다른 팁

바퀴를 재발 명하지 않는 것은 항상 좋습니다. Apache는 I/O 운영을 수행하기위한 아름다운 라이브러리를 제공했습니다. 보세요 http://commons.apache.org/io/description.html

다음은 제공되는 시나리오입니다. 메모리를 유지하고자하는 데이터가 있다고 가정하지만, 얼마나 많은 데이터가 있을지 미리 알지 못합니다. 너무 많으면 메모리를 호그하는 대신 디스크에 쓰기를 원하지만 디스크가 느리고 정리를위한 추적이 필요한 리소스이기 때문에 필요할 때까지 디스크에 쓰고 싶지 않습니다.

그래서 당신은 임시 버퍼를 만들고 그것에 글을 쓰기 시작합니다. 메모리에 보관하려는 임계 값에 도달하면 파일을 작성하고 해당 파일에 버퍼에있는 내용을 작성하고 버퍼 대신 파일에 모든 후속 데이터를 작성해야합니다.

그게 뭐야 DeferredoutputStream 당신을 위해. 스위치 오버 시점에서 모든 혼란을 숨 깁니다. 처음에 지연된 스트림을 만들고 임계 값을 구성한 다음 마음의 내용에 적어두기 만하면됩니다.

편집 : 방금 Google을 사용하여 소규모 재 검색을 했는데이 링크를 찾았습니다.http://lists.apple.com/archives/java-dev/2004/apr/msg00086.html(번개 빠른 파일 읽기/쓰기). 매우 인상적.

바이트를 감싸는 것은 속도를 늦추지 않을 것입니다 ... 거대한 배열 사본이나 다른 작은 성능 악은 없습니다. Javadocs : java.nio.bytebuffer .wrap ()

바이트 어레이를 버퍼로 감습니다.

새 버퍼는 주어진 바이트 어레이에 의해 뒷받침됩니다. 즉, 버퍼로의 수정으로 배열이 수정되고 그 반대도 마찬가지입니다. 새로운 버퍼의 용량과 한계는 배열입니다. 길이, 위치는 0이며 그 마크는 정의되지 않습니다. 백업 배열은 주어진 배열이며 배열 오프셋은 0이됩니다.

bytebuffer.wrap () 함수를 사용해도 큰 부담이되지 않습니다. 간단한 개체를 할당하고 몇 개의 정수를 초기화합니다. Bytebuffer에 대해 알고리즘을 작성하는 것이 최선의 방법입니다. 읽기 전용 파일로 작업 해야하는 경우.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top