2013-06-20 2 views
3

read (byte []) 대신 파일에 readFully()을 사용하면 처리 시간이 크게 줄어 듭니다. 그러나 readFully는 양날 검이 될 수도 있습니다. 실수로 거대한 멀티 기가 바이트 파일을 읽으려고하면 소리가 질 수 있습니다. 내가 대신 사용한다면ReadFully() 질식 위험에 처해 있습니까?

public static byte[] createChecksum(File log, String type) throws Exception { 
    DataInputStream fis = new DataInputStream(new FileInputStream(log)); 
    Long len = log.length(); 
    byte[] buffer = new byte[len.intValue()]; 
    fis.readFully(buffer); // TODO: readFully may come at the risk of 
          // choking on a huge file. 
    fis.close(); 
    MessageDigest complete = MessageDigest.getInstance(type); 
    complete.update(buffer); 
    return complete.digest(); 
} 

: 여기

함수 I는 SHA-256 체크섬을 생성하는 데 사용하고있다

DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(log))); 

겠습니까을 이러한 위험을 allieviate인가? 아니면 ... 모든 바이트가 읽힐 때까지 항상 읽어 들인 바이트의 양을 제어하고 루프를 사용하기위한 최상의 옵션입니다 (데이터 크기를 가꿀 수없는 상황에서)?

(MessageDigest API가 한 번에 전체 바이트 배열을 사용하기 때문에 생각해보십시오. 한 번에 모든 데이터를 채우지 않고 체크섬을 얻는 방법을 모르지만 다른 질문이 있다고 생각합니다.

+1

사용중인'update()'메소드가 모든 데이터를 요구하지는 않습니다. 다이제스트 당 여러 번 호출 할 수 있습니다. – erickson

답변

4

아마도 적당한 크기의 버퍼 (아마도 65536 바이트)를 할당하고 "complete.update()"를 사용하여 한 번에 64kb를 읽는 루프를 수행하여 내부의 소화기에 추가해야합니다. 루프 마지막 블록에서 읽기 전용 바이트 (아마도 64KB 미만) 만 처리하면됩니다.

1

파일이 여러 기가 바이트 인 경우 readFully()가 숨 막히지 않고 해당 바이트 버퍼를 할당합니다. 너는 out-of-m 얻을거야. readFully()를 호출하기 전에 emory 예외가 발생합니다.

전체 파일을 한꺼번에 업데이트하지 않고 파일 청크를 반복하여 업데이트하는 방법을 사용해야합니다.

2

readFully() 사용 여부에 상관없이 파일을 읽는 데 오랜 시간이 걸립니다.

실제로 기가 바이트 크기의 바이트 배열을 할당 할 수 있는지 여부는 또 다른 질문입니다. 파일을 다운로드 할 때 readFully()를 사용할 필요가 없습니다. 그것은 다음 12 바이트가 식별자이고 주소 정보의 또 다른 60 바이트가 이어지고 루프를 계속 작성하고 싶지 않다고 말하는 유선 프로토콜에 사용됩니다.

관련 문제