2014-11-06 4 views
1

다른 파일과 내 파일을 비교하는 클래스 비교자가 있습니다. 이 부분에서는 다른 파일의 블록과 비교할 파일에서 바이트 블록을 가져 오려고합니다. 나는 큰 파일 하나를 사용하려고하면버퍼 언더 플로 예외 java

public class CompareFiles { 

    private byte[] getBytesFromFile(File file) throws IOException { 
    long BUFFER_SIZE = 4 * 1024; 
    RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
    FileChannel fc = raf.getChannel(); 
    MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, BUFFER_SIZE); 
    byte[] bytes = new byte[(int) fc.size()]; 
    buffer.get(bytes); 
    buffer.clear(); 
    return bytes; 
    } 
} 

나는 내가 내 마음에 실수를하고 잘못된 방법으로 블록과 비교 하시고

Exception in thread "main" java.nio.BufferUnderflowException 
at java.nio.DirectByteBuffer.get(Unknown Source) 
at java.nio.ByteBuffer.get(Unknown Source) 

같아요

를 얻을.

답변

2

문제는 작은 지역 (예 : 4 KB 그리고 내가 추측하는 전체 파일을 읽으려고하는 것은 4 KB 이상입니다.

아직, finally 블록이나 try-with-resource 블록에서 파일을 끝내면 항상 닫아야합니다. buffer.clear();은이 경우 아무 것도하지 않습니다.

메모리 매핑 된 파일을 사용하고 데이터를 바이트 []로 복사하지 않아도되는 주요 이점. 만약 byte []가 필요하다면 그것을 byte []에 직접 읽어 들여라. 최적의 솔루션을 원하면 바이트 []를 사용하지 마십시오.